Django:如何在不丢失<p>或任何其他元素中的每个字段的情况下呈现表单集而又不丢失管理表单?

问题描述

我通过以下方式渲染模型表单集:

<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>