问题描述
我通过以下方式渲染模型表单集:
<form method="POST" class="note-form">
{{ formset.management_data }}
{% csrf_token %}
{{ formset.as_p}}
<input type="submit" value="Save">
</form>
但是,这会在<p>
元素中以每种形式呈现每个字段,这是我不想要的。它的包装是这样的:
<form method="POST" class="note-form">
<input type="hidden" name="csrfmiddlewaretoken"...>
<input type="hidden" name="form-TOTAL-FORMS"...>
<input type="hidden" name="form-INITIAL-FORMS"...>
<input type="hidden" name="form-MIN-NUM-FORMS"...>
<input type="hidden" name="form-MAX-NUM-FORMS"...>
<p>
<textarea ...></textarea>
</p>
<p>
<input ...>
</p>
<p>
<input ...>
</p>
<p>
<textarea ...></textarea>
</p>
...and so on...
</form>
相反,我想要可以这样渲染的东西
<form method="POST" class="note-form">
<input type="hidden" name="csrfmiddlewaretoken"...>
<input type="hidden" name="form-TOTAL-FORMS"...>
<input type="hidden" name="form-INITIAL-FORMS"...>
<input type="hidden" name="form-MIN-NUM-FORMS"...>
<input type="hidden" name="form-MAX-NUM-FORMS"...>
<div ...>
<textarea ...></textarea>
<input ...>
<input ...>
</div>
<div ...>
<textarea ...></textarea>
<input ...>
<input ...>
</div>
....and so on....
即div元素中的每个表单。现在,我尝试执行以下操作
<form method="POST" class="note-form">
{{ formset.management_data }}
{% csrf_token %}
{% for form in formset %}
<div>
{{ form }}
</div>
{% endfor %}
<input type="submit" value="Save">
</form>
这将以我想要的方式呈现表单集。问题在于,当我这样做时,管理数据会消失,并且会收到错误消息“ ManagementForm数据丢失或已被篡改”。
我发现了一些与in the documentation类似的东西,但仍然对我不起作用。我在做什么错了?
解决方法
尝试:
<table>
{{ formset.as_table }}
</table>
,
很显然,如果未使用{{ formset.as_p }}
,{{ formset.as_table }}
或类似形式呈现表单集,则不会自动呈现管理数据。它必须手动呈现。
{{ formset.management_data }}
{% csrf_token %}
<div class="notes-pane">
{{ formset.management_form }}
{% for form in formset %}
<div>
{{ form }}
</div>
{% endfor %}
<input type="submit" value="Save">
</div>
</form>