[Django]-How to render Django form errors not in a UL?

110👍

You can display your error as the following in your template:

<p>{{ form.fieldname.errors.as_text }}</p>

16👍

It obviously can’t render within the context of the field because these are “non-field errors” as the attribute name implies. The only way to fix this is to add the error in the right place when validating. For example, doing the following results in non-field errors:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def clean(self):
        somefield = self.cleaned_data.get('somefield')
        if not somefield:
            raise forms.ValidationError('Some field is blank')

However, you can do the following to make that error still show on the right field:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

    def clean(self):
        somefield = self.cleaned_data.get('somefield')
        if not somefield:
            if not self._errors.has_key('somefield'):
                from django.forms.util import ErrorList
                self._errors['somefield'] = ErrorList()
            self._errors['somefield'].append('Some field is blank')

UPDATE:

From the Django docs:

Each named form-field can be output to the template using {{
form.name_of_field }}, which will produce the HTML needed to display
the form widget. Using {{ form.name_of_field.errors }} displays a list
of form errors, rendered as an unordered list. This might look like:

<ul class="errorlist">
    <li>Sender is required.</li>
</ul>

The list has a CSS class of errorlist to allow you to style its
appearance. If you wish to further customize the display of errors you
can do so by looping over them (emphasis mine)
:

{% if form.subject.errors %}
    <ol>
    {% for error in form.subject.errors %}
        <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
    </ol>
{% endif %}

Leave a comment