我有一个基本的Form子类,其中生成了一个formset,如:
MyFormset = formset_factory(
MyForm,
extra=5,
max_num=5,
)
我希望能够从form.save()
和form.__init__
方法中访问表单的索引。
答案 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。