non_form_errors不显示

时间:2018-01-31 14:05:00

标签: python django django-forms

我正在使用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>

任何想法如何显示验证错误消息或为什么它没有显示。

1 个答案:

答案 0 :(得分:0)

non_form_errors属于 formset ,不属于表单。

所以你可以用:

显示它
{{ formset.non_form_errors }}

或者在您的情况下,因为您使用变量inlines

{{ inlines.non_form_errors }}

由于它属于formset,你应该通过表单在forloop的进行。

如果表单上的错误不属于任何字段,那么您可以使用

访问这些错误
{{ form.non_field_errors }}