Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to render Django form errors not in a UL?

The errors in my Django form are rendering in a UL as per the docs...

Django

{{ form.non_field_errors }} 

HTML

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

How can I render the errors so they appear not in a UL, but in a paragraph tag for each fields relevant error? So ideally...

<ul>   <li>     <label>...</label>     <input>...</input>     <p>Error message...</p>   </li> </ul> 

EDIT:

I should have used this code in my example for clarity...

{{ form.fieldname.errors }} 
like image 463
Dan Avatar asked Sep 14 '11 16:09

Dan


People also ask

What is form Is_valid () in Django?

The is_valid() method is used to perform validation for each field of the form, it is defined in Django Form class. It returns True if data is valid and place all data into a cleaned_data attribute.

Which function of Django's form class will render a form's fields as a series of P tags?

{{ form. as_p }} – Render Django Forms as paragraph.


2 Answers

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

<p>{{ form.fieldname.errors.as_text }}</p> 
like image 94
Thierry Lam Avatar answered Sep 24 '22 02:09

Thierry Lam


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 %} 
like image 33
Chris Pratt Avatar answered Sep 24 '22 02:09

Chris Pratt