2010-07-09 18 views
7

Me gustaría crear widgets que agreguen clases específicas al marcado de elemento cuando el campo asociado tenga errores.Django: ¿Cómo verificar si hay errores de campo dentro de la definición de widget personalizado?

Tengo dificultades para encontrar información sobre cómo verificar si un campo tiene errores asociados, desde el código de definición del widget.

Por el momento tengo el siguiente código de artilugio stub (el artilugio final usará marcas más complejas).

from django import forms 
from django.utils.safestring import mark_safe 
class CustomTextWidget(forms.Widget): 
     def render(self, name, value, attrs): 
      field_has_errors=False # change to dynamically reflect field errors, somehow 
      if field_has_errors: 
       error_class_string="error" 
      else: 
       error_class_string="" 
      return mark_safe(
      "<input type=\"text\" class=\"%s\" value=\"%s\" id=\"id_%s\" name=\"%s\">" % (error_class_string, value, name, name) 
      ) 

¿Alguien puede arrojar luz sobre una manera sensata para rellenar los field_has_errors booleanas aquí? (o tal vez sugiera una mejor manera de lograr lo que estoy tratando de hacer). Gracias por adelantado.

Respuesta

9

Como dice Jason, el widget no tiene acceso al campo mismo. Creo que una mejor solución es utilizar la naturaleza en cascada de CSS.

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

En su CSS que puede hacer:

div.field_error input { color: red } 

o lo que usted necesita.

+0

Este es definitivamente el camino a seguir y es realmente el enfoque que siempre tomo en mi propio trabajo. El ejemplo que proporcioné fue ensamblado en un esfuerzo por mostrar el paso de atributos a los widgets (no solo widgets personalizados), sin embargo, debe evitarse ya que no es SECO. –

+0

dos años después me ayudó. Gracias :) – Houman

+0

¿Por qué no pasan la información del error al widget? Parece que sería razonable para mí, ya que es común presentar errores justo al lado de la entrada para el campo. – Andy

3

El widget no tiene conocimiento del campo al que se está aplicando. Es el campo que mantiene información sobre errores. Puede comprobar si hay error_messages en el init método de su forma, e inyectar una clase de error a su widget en consecuencia:

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

Mucho mejor DRY answer – Alvaro

Cuestiones relacionadas