我是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的方法。 有没有正确的方法来做到这一点?
提前致谢 康拉德
答案 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)