通过FormSet将参数传递给ModelForm

时间:2013-11-28 23:42:09

标签: django django-forms

我是Formsets的新手,我遇到了问题。

我使用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)

工作正常,但只有当我从ModelForm类中注释掉“self.user ....”和“self.fields ....”行时才会正常工作。

我尝试了几种将参数从视图中的调用传递给ModelForm的方法。 有没有正确的方法来做到这一点?

提前致谢 康拉德

1 个答案:

答案 0 :(得分: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的闭包意味着您可以正确设置查询集。请注意,__init__方法使用与其父类相同的参数,因此当我们在视图中使用modelformset_factory时,我们不再有任何问题。

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