我有一个 Django 表单集,在其中呈现表单的四个实例。表单集中的每个表单都有两个字段,但我希望最后一个(第四个)实例仅显示/输入一个字段。我该如何做到这一点,或者有更好的方法吗?我尝试将表单集限制为三个字段,并使第四个实例成为其自己的表单,但我需要根据表单集中的 field1
字段验证该 field1
。我不知道如何根据同时提交的表单集验证表单。
View .py:
FormSet = formset_factory(MyForm, formset=BaseMyFormSet, extra=4)
.html:
<form action="" method="post">{% csrf_token %}
{{ formset.management_form }}
{{ formset.non_form_errors }}
<div>
{% for form in formset %}
{% for field in form %}
{{ field.errors }}
{{ field.label_tag }}: {{ field }}
{% endfor %}
{% endfor %}
</div>
<p><input type="submit" value="Submit" /></p>
</form>
表单集在 forms.py 中有两个字段:
class MyForm(forms.Form):
# field1
# field2
如何使表单集中的前三个表单具有两个字段,但最后一个仅包含 field1
?
最佳答案
尝试显式删除views.py中最后一个表单的字段:
def view_func(request):
FormSet = formset_factory(MyForm, formset=BaseMyFormSet, extra=4)
if request.method == 'POST':
formset = FormSet(request.POST, request.FILES)
# assuming this is a required field for the other forms
formset.forms[-1].fields['field2'].required = False
if formset.is_valid():
...
else:
formset = FormSet()
del formset.forms[-1].fields['field2']
return render(request, 'form.html', {'formset': formset})
任何进一步的调整取决于您的表单和验证逻辑。 BaseMyFormSet.clean()
是 formset-wide validation 的适当位置听起来您已经有代码可以跨表单比较 field1
。
(从纯粹的意义上来说,让 FormSet 类完全处理这个问题可能会更好,但这更容易。FormSet 代码相当复杂。重写 BaseFormSet.forms() 是有意义的,但使用 @ cached_property
位,您所涉及的实现细节最好留给 Django。)
关于django - 修改 Django 表单集中的一个表单实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22330431/