首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django将自定义表单参数传递给Formset

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

Stack Overflow用户
提问于 2009-03-08 03:36:08
回答 12查看 47.7K关注 0票数 157

在带有form_kwargs的Django 1.9中,

修复了这个问题。

我有一个Django表单,看起来像这样:

代码语言:javascript
复制
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)

我用下面这样的方式调用这个表单:

代码语言:javascript
复制
form = ServiceForm(affiliate=request.affiliate)

其中request.affiliate是已登录的用户。这可以达到预期的效果。

我的问题是,我现在想把这个单一的表单变成一个表单集。我不明白的是,在创建表单集时如何将从属关系信息传递给各个表单。根据文档,要创建一个表单集,我需要这样做:

代码语言:javascript
复制
ServiceFormSet = forms.formsets.formset_factory(ServiceForm, extra=3)

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

代码语言:javascript
复制
formset = ServiceFormSet()

现在,我如何以这种方式将affiliate=request.affiliate传递给各个窗体?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-03-08 18:00:27

我会使用functools.partialfunctools.wraps

代码语言:javascript
复制
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 (即使其难于子类化)。

票数 107
EN

Stack Overflow用户

发布于 2016-03-05 14:41:13

公文方式

Django 2.0:

代码语言:javascript
复制
ArticleFormSet = formset_factory(MyArticleForm)
formset = ArticleFormSet(form_kwargs={'user': request.user})

https://docs.djangoproject.com/en/2.0/topics/forms/formsets/#passing-custom-parameters-to-formset-forms

票数 101
EN

Stack Overflow用户

发布于 2009-03-08 04:24:10

我会在一个函数中动态构建form类,这样它就可以通过闭包访问从属关系:

代码语言:javascript
复制
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

额外的好处是,您不必在选项字段中重写查询集。缺点是子类化有点时髦。(任何子类都必须以类似的方式创建。)

编辑:

作为对注释的响应,您可以在使用类名的任何位置调用此函数:

代码语言:javascript
复制
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)
    ...
票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/622982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档