2013-10-10 36 views
1

我使用內聯formset,並且需要在實例化formset時更改其中一個非父模型的表單字段的queryset。在非父模型的inlineformset中更改模型字段的查詢集

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的價值,我需要改變「other_model」字段的BarForm的查詢集所有形式的表單集。有沒有辦法做到這一點?

回答

5

如果我的理解正確無誤,您可以這樣做...您可以覆蓋BaseInlineFormSet,然後在formset中的每個表單上手動設置該字段的查詢集。

因此,在你forms.py,你可以這樣做:

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 

注意的第一個參數如何__init__是你要設置的查詢集。

然後在你看來,你只需要修改你的當前代碼。通過在新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 

表單集是非常複雜的,有時,所以希望這是有道理的...讓我知道你是否有問題。

+0

這似乎解決了查詢集的問題。然而,即使它沒有變化,我仍然在我的額外表格上發現驗證錯誤。我的印象是,formset不會這麼做。來自django文檔「該表單足夠聰明,可以忽略沒有改變的額外表單。」 – bgrantdev

+0

你說得對。如果表單真的是空的,你不應該得到錯誤。您的表單上沒有任何默認值或您有什麼要求? – jproffitt

相關問題