使用Django inline formset时字段重复问题求助
问题原因与解决方法
你遇到的字段重复问题是因为代码中两次渲染了整个表单:
- 第一处是
{{ form|crispy }}—— 这行代码会自动渲染表单的所有字段,同时应用crispy forms的样式 - 第二处是
{% for field in form %}循环 —— 这里又手动遍历并渲染了表单的每一个字段
两种渲染方式叠加,直接导致所有字段重复显示。
修正方案(二选一)
方案1:保留crispy渲染,删除手动循环部分
适合想直接复用crispy forms样式的场景:
{% block content %} <form enctype="multipart/form-data" class="container mx-auto sm:px-4" method="post" id="recipe_form"> {% csrf_token %} {{ form|crispy }} <div class="max-w-sm w-full lg:max-w-full lg:flex"> <div class="mb-8"> <h4 class="text-gray-900 font-bold text-xl mb-2">Add Recipe!</h4> </div> <!-- 移除手动循环字段的代码块 --> </div> <!-- 此处添加inline formset的渲染代码,比如{{ formset.management_form }}及formset字段遍历 --> </form> {% endblock %}
方案2:删除crispy渲染,保留手动自定义渲染
适合需要完全自定义字段布局的场景:
{% block content %} <form enctype="multipart/form-data" class="container mx-auto sm:px-4" method="post" id="recipe_form"> {% csrf_token %} <div class="max-w-sm w-full lg:max-w-full lg:flex"> <div class="mb-8"> <h4 class="text-gray-900 font-bold text-xl mb-2">Add Recipe!</h4> </div> {% for field in form %} <div class="mb-4 flex-auto p-6"> <label>{{field.label}}</label> {% if field.field.required %} <span style="color: red;" class="required">*</span> {% endif %} {{field}} {% if field.help_text %} <small style="color: grey">{{ field.help_text }}</small> {% endif %} {% for error in field.errors %} <p style="color: red">{{ error }}</p> {% endfor %} </div> {% endfor %} </div> <!-- 此处添加inline formset的渲染代码,比如{{ formset.management_form }}及formset字段遍历 --> </form> {% endblock %}
注意:你提到使用inline formsets,务必记得在表单中添加inline formset的必要代码(如{{ formset.management_form }}),否则inline表单无法正常提交。
内容的提问来源于stack exchange,提问作者C0untV
相关产品推荐
相关产品推荐

