web-dev-qa-db-fra.com

Comment rendre Django forme des erreurs pas dans un UL?

Les erreurs dans ma forme Django se rendent dans un UL selon le docs ...

Django

{{ form.non_field_errors }}

HTML

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

Comment puis-je rendre les erreurs afin qu'elles n'apparaissent pas dans une UL, mais dans une balise de paragraphe pour chaque champ d'erreur pertinente? Donc idéalement ...

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

MODIFIER:

J'aurais dû utiliser ce code dans mon exemple pour plus de clarté ...

{{ form.fieldname.errors }}
51
Dan

Vous pouvez afficher votre erreur comme suit dans votre modèle:

<p>{{ form.fieldname.errors.as_text }}</p>
96
Thierry Lam

Il ne peut évidemment pas être rendu dans le contexte du champ car ce sont des "erreurs non liées au champ" comme le nom de l'attribut l'indique. La seule façon de résoudre ce problème consiste à ajouter l'erreur au bon endroit lors de la validation. Par exemple, l'exécution des résultats suivants entraîne des erreurs non liées au champ:

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')

Cependant, vous pouvez effectuer les opérations suivantes pour que cette erreur s'affiche toujours dans le champ de droite:

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')

MISE À JOUR:

Depuis le Django docs :

Chaque champ de formulaire nommé peut être sorti dans le modèle en utilisant {{form.name_of_field}}, qui produira le HTML nécessaire pour afficher le widget de formulaire. L'utilisation de {{form.name_of_field.errors}} affiche une liste d'erreurs de formulaire, rendue sous forme de liste non ordonnée. Cela pourrait ressembler à ceci:

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

La liste a une classe CSS de liste d'erreurs pour vous permettre de styliser son apparence. Si vous souhaitez personnaliser davantage l'affichage des erreurs, vous pouvez le faire en les bouclant (accentuez le mien):

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