我的模型formset甚至没有定义" extra" modelformset_factory中的参数在模板中渲染一个额外的字段。我尝试了很多变化,但它没有奏效。如果我在命令行上打印表单(模型表单),它只是根据需要打印单个表单字段,但在模型formset上默认打印2。
这是我的代码。
models.py
class Direction(models.Model):
text = models.TextField(blank=True, verbose_name='Direction|text')
forms.py
class DirectionForm(forms.ModelForm):
class Meta:
model = Direction
fields = ['text',]
views.py
def myview(request):
Dirset = modelformset_factory(Direction, form=DirectionForm)
if request.method == "POST":
dir_formset = Dirset(request.POST or None)
if dir_formset.is_valid():
for direction in dir_formset:
text = direction.cleaned_data.get('text')
Direction.objects.create(text=text)
return render(request, "test/test.html", {'DirFormSet':Dirset})
模板
{% block content %}
<form method="POST">{% csrf_token %}
<div id="forms">
{{DirFormSet.management_form}}
{% for form in DirFormSet %}
{{form.text}}
{% if error in form.text.errors %}
{{error|escape}
{% endif %}
{% endfor %}
</div>
<button id="add-another">add another</button>
<input type="submit" />
</form>
{% endblock %}
作为旁注,如果我在此表单上提交数据,则会出现以下错误。 的错误
Exception Type: MultiValueDictKeyError
Exception Value:"u'form-0-id'"
答案 0 :(得分:4)
默认情况下,modelformset_factory
会创建一个额外的表单。如果您不想要任何其他表格,请设置extra=0
。
Dirset = modelformset_factory(Direction, form=DirectionForm, extra=0)
KeyError
是因为您没有在模板中添加表单id
字段。你应该有类似的东西:
{% for form in dir_formset %}
{{ form.id }}
{{ form.text }}
...
{% endfor %}
请注意,在呈现模板时,您应该传递formset实例dir_formset
,而不是类DirFormSet
。你的观点应该是
return render(request, "test/test.html", {'dir_formset': dir_formset})
然后应该更新模板以使用dir_formset
而不是DirFormSet
。