gpt4 book ai didi

django - 通过 FormSet 将参数传递给 ModelForm

转载 作者:行者123 更新时间:2023-12-04 05:47:58 27 4
gpt4 key购买 nike

我对 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)

该表单从 View 中获取它的参数:
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....”行时。

我尝试了几种将 View 内部调用中的参数传递给 ModelForm 的方法。
有没有合适的方法来做到这一点?

提前致谢
康拉德

最佳答案

应该可以对 BaseModelFormset 进行子类化以便在构造时将用户传递给每个表单。然而,这相当棘手。

一种更简单的技术是定义一个为给定用户创建模型表单的函数,并在 View 中动态创建模型表单类。

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 时不再有任何问题在 View 中。
AddUpdateEntryForm = create_form(user)
AddEntryFormSet = modelformset_factory(model=Zeit, form=AddUpdateEntryForm)

关于django - 通过 FormSet 将参数传递给 ModelForm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20276302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com