【问题标题】:cant pass initial values to a formset using curry无法使用 curry 将初始值传递给表单集
【发布时间】:2012-08-15 21:38:45
【问题描述】:

根据这个 SO 问题Django Passing Custom Form Parameters to Formset 我尝试使用 curry 将初始值字典传递给我的表单集。

它不起作用,它给了我一组空值,这不是它应该做的。

谁能看看我执行这个错误吗?

data = {'supplier': input_data['supplier'],}

InstanceFormSet = formset_factory(BulkAddInstanceForm, extra=int(input_data['copies']))
InstanceFormSet.form = staticmethod(curry(BulkAddInstanceForm, data))

编辑:根据要求

class BulkAddInstanceForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(BulkAddInstanceForm, self).__init__(*args, **kwargs)

        self.fields['supplier'] = forms.ModelChoiceField(
            queryset=Supplier.objects.all(),
            label='Supplier',
            empty_label='Select a Supplier...',
            required=True,
        )
        self.fields['syllabus'] = forms.ModelChoiceField(
            queryset=Syllabus.objects.all(),
            label='Syllabus',
            empty_label='Select a Syllabus...',
            widget=FilterWidget(
                queryset=Syllabus.objects.all(),
                parent_queryset=Supplier.objects.all(),
                control_name='supplier',
                parent_attr='supplier',
            ),
            required=False,
        )
        self.fields['venue'] = forms.ModelChoiceField(
            queryset=Venue.objects.all(),
            label='Venue',
            empty_label='Select a Venue...',
            widget=FilterWidget(
                queryset=Venue.objects.all(),
                parent_queryset=Supplier.objects.all(),
                control_name='supplier',
                parent_attr='supplier',
            ),
            required=False,
        )
    start_date = NiceDateField(required=False, label='Start Date')
    residential = forms.BooleanField(label='Res?', required=False)
    special_offers = forms.BooleanField(label='S/O?', required=False)
    manual_price = forms.IntegerField(required=False)
    manual_cost = forms.IntegerField(required=False)

edit2:粮农组织布兰登

我看过 docco,它建议做不同的事情。

formset = formset_factory(BulkAddInstanceForm, extra=int(input_data['copies']))
formset = InstanceFormSet(initial=[data, ])

它创建了一个包含“副本”数量的表单的表单集,以及另一个包含数据的表单集。 如果我这样做

formset = InstanceFormSet(initial=[data, data])

然后我得到两个额外的表格,其中包含数据。 所以我的想法是我需要一个迭代器来添加“副本”数量的字典并将表单集中的初始表单数量归零。

我还不知道怎么编码!!

【问题讨论】:

  • 我们可以看看你的 BulkAddInstanceForm 吗?

标签: django forms formsets


【解决方案1】:

您需要在__init__ 期间获取您传递的值

当我过去使用它时,我已经将参数设置为:

class MyForm(forms.Form):
    def __init__(self, data, *args, **kwargs):
        self.data = data
        #do whatever else I need to do with data

        super(MyForm, self).__init__(*args, **kwargs)

希望对你有所帮助。

【讨论】:

  • 我尝试过这样做,但它不适用于动态字段,因为稍后使用查询集对其进行初始化时会清除该值。我已经成功地重新填充了它自己存在的相同表单,而不是通过传递初始数据的字典作为表单集的一部分。我只需要知道为什么我的与链接的文章类似的代码不起作用。
  • 您是否只是想为“供应商”字段提供初始值?还是?
  • 我有一个字段字典要填写。基本上,我正在构建一个批量添加功能。用户访问并填写模板表单,然后视图将使用选项重新填充模板表单,并构建一个包含选项和一些附加选项的表单集。
【解决方案2】:

使用以下代码设法做到了:

InstanceFormSet = formset_factory(BulkAddInstanceForm, extra=0)
# build the list for populating the forms
    n, datalist = 0, []
    while n < int(input_data['copies']):
        datalist.append(data)
        print datalist
        n +=1

    formset = InstanceFormSet(initial=datalist)

所以我创建了表单集,然后创建了一个数据字典列表,然后用初始数据作为列表填充表单集。

目前看来工作正常,但我必须弄清楚如何收集和提交信息。

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2012-09-07
    • 2011-10-06
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多