我正在使用inlineformset_factory
并创建了forms.BaseInlineFormSet
来覆盖clean
函数以进行一些验证。验证工作且表单未被接受,但重新加载页面时不会显示ValidationError
消息。
这是我的表单类:
class BaseDetailFormSet(forms.BaseInlineFormSet):
def clean(self):
super(BaseDetailFormSet, self).clean()
if any(self.errors):
return self.errors
for form in self.forms:
product = form.cleaned_data['product']
if form.cleaned_data['quantity_sold'] > product.quantity_in_stock:
raise forms.ValidationError(_('not enough products'))
DetailFormset = inlineformset_factory(Invoices,
InvoiceDetail,
fields=('product', 'quantity_sold'),
widgets= {'product': forms.Select(
attrs={
'class': 'search',
'data-live-search': 'true'
})},
formset=BaseDetailFormSet,
extra=1)
和我的html
代码:
<form class="form-inline" method="post" action="">
{% csrf_token%}
{% include '_layouts/form_snippet.html' %}
<table class="table">
{{inlines.management_form}}
{%for form in inlines.forms%}
{% if forloop.first%}
<thead>
<tr>
{%for field in form.visible_fields%}
<th>{{field.label|capfirst}}</th>
{%endfor%}
{%endif%}
</tr>
</thead>
<tr class="formset_row">
{{ form.non_form_errors }}
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<button type="submit" value="Add" class="btn btn-inverse">{% trans 'Submit Invoice' %}</button>
</form>
任何想法如何显示验证错误消息或为什么它没有显示。
答案 0 :(得分:0)
non_form_errors
属于 formset ,不属于表单。
所以你可以用:
显示它{{ formset.non_form_errors }}
或者在您的情况下,因为您使用变量inlines
:
{{ inlines.non_form_errors }}
由于它属于formset,你应该通过表单在forloop的外进行。
如果表单上的错误不属于任何字段,那么您可以使用
访问这些错误{{ form.non_field_errors }}