2012-07-28 2 views
0

여기에서이 방법을 사용했습니다 :Django에서 외래 키의 선택을 제한하는 방법은 항상 현재 값을 포함합니까?

ModelA의 foriegn 키에 대한 선택을 ModelB의 "활성"으로 제한하는 항목으로 제한 할 수 있습니다. 이렇게하면 ModelB 항목이 나중에 쓸모 없을 때 비활성화 될 수 있습니다. 그런 다음 사용자가 새 ModelA를 입력하면 활성 ModelB 항목 만 표시됩니다.

그러나 비활성 ModelB를 참조하는 이전 ModelA를 수정하면 비활성 ModelB가 목록에 표시되지 않습니다. 그래서 정보를 저장할 수 없습니다 (당장은 관리자를 통해 일하고 있습니다). 이것을 처리하는 좋은 방법이 있습니까? 올바른 목록 (모든 활성 ModelB)을 표시 한 다음 비활성 상태 인 경우에도 현재 선택한 ModelB를 포함시키는 것이 좋습니다.

답변

2

원하는대로 할 수 있습니다. 기본적으로 양식이 기존 ModelA 객체에 렌더링되고 있는지 여부를 확인한 다음 ModelB 필드에 대한 쿼리 세트를 변경하여 현재 활성화 된 모든 ModelB 객체와 현재 할당 된 객체를 필터링합니다.

class ModelAAdminForm(forms.ModelForm): 
    class Meta: 
     model = ModelA 

    def __init__(self, *args, **kwargs): 
     super(ModelAAdminForm, self).__init__(*args, **kwargs) 
     if self.instance.id and self.instance.modelb: 
      q = Q(active=True)| Q(id=self.instance.modelb.id) 
      self.fields['modelb'].queryset = ModelB.objects.filter(q) 
     else: 
      self.fields['modelb'].queryset = ModelB.objects.filter(active=True) 


class ModelAAdmin(admin.ModelAdmin): 
    form = ModelAAdminForm 
관련 문제