2010-07-09 4 views
7

Je voudrais créer des widgets qui ajoutent des classes spécifiques au balisage d'élément lorsque le champ associé a des erreurs.Django: Comment vérifier s'il y a des erreurs de champs dans la définition du widget personnalisé?

J'ai du mal à trouver des informations sur la façon de vérifier si un champ a des erreurs qui lui sont associées, à partir du code de définition du widget. En ce moment, j'ai le code du widget de bout (le widget final utilisera un balisage plus complexe). Quelqu'un peut-il faire la lumière sur une manière sensée de remplir le champ field_has_errors booléen ici? (ou peut-être proposer un meilleur moyen d'accomplir ce que j'essaie de faire). Merci d'avance.

Répondre

9

Comme le dit Jason, le widget n'a pas accès au champ lui-même. Je pense cependant qu'une meilleure solution consiste à utiliser la nature en cascade de CSS.

{% for field in form %} 
<div class="field{% if field.errors %} field_error{% endif %}"> 
{{ field }} 
</div> 
{% endfor %} 

maintenant dans votre CSS, vous pouvez faire:

div.field_error input { color: red } 

ou tout ce que vous avez besoin.

+0

C'est vraiment la voie à suivre et c'est en fait l'approche que je prends toujours dans mon propre travail. L'exemple que j'ai fourni a été bricolé dans le but de montrer le passage des attributs aux widgets (pas seulement les widgets personnalisés), cependant cela devrait être évité car ce n'est pas DRY. –

+0

deux ans plus tard, il m'a aidé. Merci :) – Houman

+0

Pourquoi ne transmettent-ils pas les informations d'erreur au widget? On dirait que ce serait raisonnable pour moi, car il est courant de faire des erreurs juste à côté de l'entrée pour le terrain. – Andy

3

Le widget n'a aucune connaissance du champ auquel il est appliqué. C'est le domaine qui conserve des informations sur les erreurs. Vous pouvez vérifier error_messages dans la méthode init de votre formulaire, et injecter une classe d'erreur à votre widget en conséquence:

class YourForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(YourForm, self).__init__(*args, **kwargs)  
     attrs = {} 
     if self.fields['your_field'].error_messages is not None: 
      attrs['class'] = 'errors' 
     self.fields['your_field'].widget = YourWidget(attrs=attrs) 
+0

Beaucoup mieux DRY réponse – Alvaro

Questions connexes