Django将自定义表单参数传递给Formset

问题:

这是在Django 1.9中修复了form_kwargs

我有一个Django表单,如下所示:

class ServiceForm(forms.Form):
    option = forms.ModelChoiceField(queryset=ServiceOption.objects.none())
    rate = forms.DecimalField(widget=custom_widgets.SmallField())
    units = forms.IntegerField(min_value=1, widget=custom_widgets.SmallField())

    def __init__(self, *args, **kwargs):
        affiliate = kwargs.pop('affiliate')
        super(ServiceForm, self).__init__(*args, **kwargs)
        self.fields["option"].queryset = ServiceOption.objects.filter(affiliate=affiliate)

我用这样的形式来表示:

form = ServiceForm(affiliate=request.affiliate)

其中request.affiliate是登录用户。这按照预期工作。
我的问题是我现在想把这个单一的表单变成一个表单。我无法想像的是,在创建表单集时,我可以如何将会员信息传递给各个表单。根据文档做出一个表单,我需要做这样的事情:

ServiceFormSet = forms.formsets.formset_factory(ServiceForm, extra=3)

然后我需要像这样创建它:

formset = ServiceFormSet()

现在我怎么能通过affiliate = request.affiliate这样的个人表单?

回答:

我会使用functools.partialfunctools.wraps

from functools import partial, wraps
from django.forms.formsets import formset_factory

ServiceFormSet = formset_factory(wraps(ServiceForm)(partial(ServiceForm, affiliate=request.affiliate)), extra=3)

我认为这是最干净的方法,并且不会以任何方式影响ServiceForm(即使其难以进行子类化)。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Django Passing Custom Form Parameters to Formset

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 71 = 80