2013-11-28 641 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

相关问题