formset中的表单如何知道它在formset中的索引?

时间:2014-08-06 09:40:25

标签: django django-forms django-1.6

我有一个基本的Form子类,其中生成了一个formset,如:

MyFormset = formset_factory(
    MyForm,
    extra=5,
    max_num=5,
)

我希望能够从form.save()form.__init__方法中访问表单的索引。

3 个答案:

答案 0 :(得分:2)

您可以将BaseFormSet子类化以将索引传递给表单:

from django.forms.formsets import BaseFormSet

class BaseMyFormSet(BaseFormSet):
    def add_fields(self, form, index):
        """A hook for adding extra fields on to each form instance."""
        super(BaseMyFormSet, self).add_fields(form, index)
        # here call a custom method or perform any other required action
        form.set_index(index)

MyFormset = formset_factory(
    MyForm,
    formset=BaseMyFormSet,
    extra=5,
    max_num=5,
)

将为formset中的每个创建表单调用此方法,您可以执行所需的任何操作。

要获取保存索引,我看到两种可能性:

1)您使用在上面的set_index方法中设置的隐藏字段

class MyForm(forms.Form):
    formset_index = forms.IntegerField(widget=forms.HiddenInput())

    def set_index(self, index):
        self.fields['formset_index'].initial = index

2)您可以使用枚举

# definition
class MyForm(forms.Form):
    def save(self, index):
    ...

# save
for index, form in enumerate(my_formset):
   form.save(index)

答案 1 :(得分:1)

表单本身永远不知道它在formset中的索引,就像任何给定的列表及其包含的对象一样。

除非你告诉它知道,所以在你的情况下,首先你必须告诉.save()接受一个额外的参数。

class MyForm(forms.Form):
   def save(self, index):
     #do save magix

然后在验证时循环遍历您的formset并将表单传递给其索引。

for index, form in enumerate(my_formset):
   form.save(index)

答案 2 :(得分:0)

如果你需要在表单中创建它,创建一个仅绑定到表单的form_id隐藏字段,然后使用JS,python或模板循环填充该字段。 在表单方法中,您可以访问id。