在带有form_kwargs的Django 1.9中,
修复了这个问题。
我有一个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传递给各个窗体?
发布于 2009-03-08 18:00:27
我会使用functools.partial和functools.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 (即使其难于子类化)。
发布于 2016-03-05 14:41:13
公文方式
Django 2.0:
ArticleFormSet = formset_factory(MyArticleForm)
formset = ArticleFormSet(form_kwargs={'user': request.user})
发布于 2009-03-08 04:24:10
我会在一个函数中动态构建form类,这样它就可以通过闭包访问从属关系:
def make_service_form(affiliate):
class ServiceForm(forms.Form):
option = forms.ModelChoiceField(
queryset=ServiceOption.objects.filter(affiliate=affiliate))
rate = forms.DecimalField(widget=custom_widgets.SmallField())
units = forms.IntegerField(min_value=1,
widget=custom_widgets.SmallField())
return ServiceForm
额外的好处是,您不必在选项字段中重写查询集。缺点是子类化有点时髦。(任何子类都必须以类似的方式创建。)
编辑:
作为对注释的响应,您可以在使用类名的任何位置调用此函数:
def view(request):
affiliate = get_object_or_404(id=request.GET.get('id'))
formset_cls = formset_factory(make_service_form(affiliate))
formset = formset_cls(request.POST)
...
https://stackoverflow.com/questions/622982
复制相似问题