2010-12-08 3 views
1

단일 관리 페이지에 공존해야하는 몇 가지 상호 연관된 모델이 있습니다.Django 관리자 인라인 양식 - 외래 키 쿼리 세트를 값 집합으로 제한

극장 제작에는 캐스트 멤버가 있고 캐스트 멤버에는 지정된 역할이 있습니다. 극장 제작은 주어진 서면 텍스트 (연극, 개작 등)와 관련이 있으며, 작성된 텍스트에는 해당 텍스트의 모든 역할 목록이 있습니다. 프로덕션을 추가 할 때 각 캐스트 멤버는 해당 역할 중 하나와 연결되어야합니다.

모델 : 여기

데이터 모델이 작동 방법, 생산, 사람, CastMember, 역할을 문서 텍스트

관계 : 생산과 사람은 "역할"필드를 추가 CastMember 통해 M2M 관계를 가지고 - Role 객체에 대한 ForeignKey입니다. 역할 자체에는 WrittenText 객체에 대한 ForeignKey가 있습니다.

문제는 다음과 같습니다. 프로덕션 용 관리 페이지에서 CastMembers를 추가하는 TabularInline이 있습니다. 테이블에있는 CastMember 항목의 'role'필드는 Production이 참조하는 WrittenText에 지정된 역할로만 제한되어야합니다.

나는 모델 양식을 재정 의하여 문제에 절반 방법 솔루션을 만든 :

class CastMemberForm(ModelForm): 
    class Meta: 
     model = CastMember 

    def __init__(self, *args, **kwargs): 
     super(CastMemberForm, self).__init__(*args, **kwargs) 
     if 'instance' in kwargs: 
     self.fields['role'].queryset = Role.objects.filter(source_text=self.instance.production.source_text) 

그러나, 당신은 드롭 다운에서 사람을 선택하고 저장 한 다음 역할을 선택하는 경우에만 이렇게 그렇지 않으면 모든 역할의 목록을 얻을 수 있습니다. kwargs에서 "if"인스턴스를 가져 오는 것은 나에게 DoesNotExistError를줍니다.

클라이언트 측 JS 같은 것이 없으면이 작업이 너무 복잡합니까? 아니면 누락 된 간단한 해결책이 있습니까?

+0

이 문제에 대한 해결책을 찾았습니까?/ –

답변

0

Here은 javascript/ajax를 통해 체인화 된 선택 상자의 예입니다. 그것은 기본적으로 같은 원칙이지만, 하나의 선택 상자를 업데이트하지 않으려면 js를 조정해야하지만, 인라인 관리자의 모든 항목은 ... 아마도 이것이 당신에게 작은 영감을줍니다!

+0

팁을 주셔서 감사합니다.하지만 조건 적으로 아무 것도 할 필요가 없습니다. 인라인의 양식에는 Production에 대한 드롭 다운이 없으며, 이는 전적으로 상위 개체를 기반으로합니다. 나는 이것으로 일 해왔다 : http://www.stereoplex.com/blog/filtering-dropdown-lists-in-the-django-admin 그러나 그것은 내가 전에 가지고 있었던 것보다 더 이상 나를 얻지 않는다. 아직 그것에 대해 노력하고 있습니다, 잘하면 응답을 게시 할 수 있습니다. :) –

관련 문제