2013-11-28 424 views
3

我對Formset有點新,而且我遇到了一個問題。通過FormSet將參數傳遞給ModelForm

我使用Modelform來創建一個新的對象。

class AddUpdateEntryForm(forms.ModelForm): 

    class Meta: 
     model = Zeit 
     exclude = ('mitarbeiter', 'user_updated') 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') 
     super(AddUpdateEntryForm, self).__init__(*args, **kwargs) 
     self.fields['projekt'].queryset = Projekt.objects.filter(firma=Mitarbeiter.objects.get(user_id=self.user).firma_id) 

這形式得到它的參數從視圖:

form = AddUpdateEntryForm(user=entry_user, initial=initial) 

現在,我想在一個頁面上顯示多個窗體。 我使用:

forms.py: 
AddEntryFormSet = formset_factory(form=AddUpdateEntryForm) 

views.py: 
formset = AddEntryFormSet(initial=initial) 

,工作正常,但只有當我註釋掉 「self.user ......」 和 「self.fields ......」 線來自ModelForm類。

我嘗試了將參數從視圖內的參數傳遞給ModelForm的幾種方法。 有沒有適當的方法來做到這一點?

預先感謝 康拉德

+0

如果您使用的範本,那麼我建議使用'modelformset_factory',而不是'formset_factory',讓你得到的[模型表單集]好處(https://docs.djangoproject.com/en /1.6/topics/forms/modelforms/#model-formsets) – Alasdair

+0

我第一次嘗試modelformset_factory,但是使用自定義ModelForm時沒有任何不同。當您想要使用ModelFormSet而不使用現有的ModelForm時,其優點是modelformset_factory。 – Conrad

+0

即使您使用自定義模型表單,也是有區別的。由'modelformset_factory'創建的模型表單集可以使用查詢集實例化,並且將具有'save()'方法,這與formset_factory創建的表單集不同。 – Alasdair

回答

2

應該是可能的子類BaseModelFormset使得它被構造,當用戶被傳遞到每個表格。但是,這非常棘手。

一個更簡單的方法是定義一個函數,爲給定的用戶創建一個模型表單,並在視圖中動態創建模型表單類。

def create_form(user): 
    """Returns a new model form which uses the correct queryset for user""" 

    class AddUpdateEntryForm(forms.ModelForm): 

     class Meta: 
      model = Zeit 
      exclude = ('mitarbeiter', 'user_updated') 

     def __init__(self, *args, **kwargs): 
      super(AddUpdateEntryForm, self).__init__(*args, **kwargs) 
      self.fields['projekt'].queryset = Projekt.objects.filter(firma=Mitarbeiter.objects.get(user_id=user).firma_id) 

    return AddUpdateEntryForm 

該函數中的關閉user意味着您可以正確設置queryset。請注意,__init__方法採用與其父類相同的參數,因此我們在視圖中使用modelformset_factory時不再有任何問題。

AddUpdateEntryForm = create_form(user) 
AddEntryFormSet = modelformset_factory(model=Zeit, form=AddUpdateEntryForm) 
+0

謝謝,但是當我在函數內部有類時,找不到它。 全局名稱'AddUpdateEntryForm'未定義 – Conrad

+0

我錯過了函數的'return'語句。如果你添加它,那麼它應該工作。 – Alasdair

+0

同樣的問題,未定義全局名稱AddUpdateEntryForm。 – Conrad

相關問題