2013-10-10 2 views
1

인라인 formset을 사용하고 있으며 formset이 인스턴스화 될 때 비 상위 모델의 양식 필드 중 하나의 쿼리 세트를 변경해야합니다.부모가 아닌 모델의 인라인 집합에있는 모델 필드의 쿼리 세트를 변경하십시오.

class Foo(Model): 
    name = models.TextField() 

class Bar(Model): 
    foo = models.ForiegnKey(Foo) 
    other_model = models.ForeignKey(OtherModel) 

class BarForm(ModelForm): 
    class Meta: 
     model=Bar 


foo = Foo.object.get(id=1) 
FormSet = inlineformset_factory(Foo, Bar, form=BarForm) 
formset = FormSet(instance=foo) 

내가보기 코드를 입력 할 때까지 결정되지 foo는의 값에 따라, 나는 해당 formset에서 모든 형태의 BarForm의 'other_model'필드의 검색어를 변경해야합니다. 이것을 할 수있는 방법이 있습니까?

답변

5

정확하게 이해했다면 다음과 같이 할 수 있습니다 ... BaseInlineFormSet을 무시한 다음 formset의 모든 양식에서 해당 필드에 대한 쿼리 집합을 수동으로 설정하십시오.

그래서 당신 forms.py, 당신은이 작업을 수행 할 것입니다 : 첫 번째 인수가 __init__하는 방법

class BaseBarFormSet(BaseInlineFormSet): 
    def __init__(self, other_model_queryset, *args, **kwargs): 
     super(BaseInlineFormSet, self).__init__(*args, **kwargs) 

     for form in self.forms: 
      form.fields['other_field'].queryset = other_model_queryset 

참고 설정하려는 검색어 세트입니다.

그런 다음보기에서 현재 코드를 적절히 수정하면됩니다. 공장 기능에 그 새로운 BaseBarFormSet으로 이동 :

FormSet = inlineformset_factory(Foo, Bar, form=BarForm, formset=forms.BaseBarFormSet) # notice formset=forms.BaseBarFormSet 

그런 다음 당신이 공장 기능에 의해 생성 된 실제 FormSet 클래스에 다른 필드에 원하는 검색어 세트를 전달합니다

formset = FormSet(OtherModel.objects.filter(…), instance=foo) #notice the first parameter 

Formsets 때로는 매우 복잡 , 잘하면 그게 말이 되네. 문제가 있다면 알려주지.

+0

그것은 queryset의 문제를 해결하는 것으로 보입니다. 그러나 변경되지 않은 경우에도 여분의 양식에 대한 유효성 검사 오류가 발생합니다. 나는 형식화가 이것을하지 않을 것이라는 인상 아래에있었습니다. django 문서에서 "formset은 변경되지 않은 여분의 양식을 무시할 정도로 똑똑합니다." – bgrantdev

+0

당신 말이 맞아요. 양식이 실제로 비어 있으면 오류가 발생하지 않아야합니다. 양식에 기본값이 없거나 어떤 것이 있습니까? – jproffitt

관련 문제