【问题标题】:Render Django Formset Manually手动渲染 Django Formset
【发布时间】:2020-05-08 19:25:07
【问题描述】:

当我使用循环渲染表单集时,一切正常。

当我尝试通过单独访问每个字段(出于前端目的)手动呈现它时,表单正在呈现但提交失败。每个字段都是相同的,所以我猜在使用我不知道的表单集时会创建一个隐藏字段。

这是我的工作代码的简化示例

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
{{ formset.management_form }}
{% for p in formset %}
    {{p.as_p}}
    {% endfor %}
</form>

还有一个不起作用的简化示例

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
{{ formset.management_form }}
{% for p in formset %}
<span class="form-sub-label-container " style="vertical-align:top">
                    {{p.field1}}
                    <label class="form-sub-label" for="input_12_city" id="sublabel_12_city" style="min-height:13px"></label>
                  </span>
    < span class="another_span">
    {{p.field2}}
 </span>
## etc....
    {% endfor %}
</form>

有什么想法吗?

谢谢。

【问题讨论】:

    标签: python django django-forms formset


    【解决方案1】:

    如果你想手动渲染每个formset表单域,你必须添加Django默认隐藏域。

    <form method="post">
        {% csrf_token %}
        {{ formset.management_form }}
        {% for p in formset %}
            {{ p.id }} # if formset is ModelFormSet
            {{ p.ORDER }} # if can_order=True
            {{ p.DELETE }} # if can_delete=True
            ... # your custom fields
        {% endfor %}
    </form>
    

    【讨论】:

    • 这很棘手,只要文档没有提及那些隐藏字段,除了可选的 ORDER 和 DELETE 字段:docs.djangoproject.com/en/3.0/topics/forms/formsets/…
    • @nigel222 没有关于id 字段的信息,当您想在表单集中手动呈现表单字段时,这是必需的。
    • @EMiDU 抱歉,没有注册。我看不到id。使用 django 2.2.8 shell,我实例化 fs = Formset({ 'form-TOTAL_FORMS': ...} ) 然后 for f in fs: print( f.id) 并显示“无属性 id”。仅在 Django 3 中没有记录的新内容?
    • @nigel222 你是对的,id 字段仅在您使用 ModelFormSet 时是必需的(我已经更新了我的答案)。请参考:stackoverflow.com/a/55361551/5612001
    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2017-06-02
    • 2014-03-12
    • 2019-04-01
    • 2019-07-08
    • 2014-09-23
    • 2020-08-16
    相关资源
    最近更新 更多