2010-02-04 11 views

Respuesta

6

Esto se puede hacer completamente a través de su plantilla.

se genera la plantilla de formulario para cada campo de formulario que desea probar se puede utilizar el siguiente ejemplo construir

<input type="text" class="reg-txt{% if form.fieldname.errors %} errors{% endif %}"/> 

Esto le permite proporcionar la interfaz que desee sin tener que modificar el código del formulario de Django vista &.

+5

¿Hay algo que se pueda hacer en el formulario o el widget ¿nivel? Esto parece más bien detallado, me gustaría tener esta clase de error en cada campo de entrada no válido, área de texto, seleccione ... –

26

Ahora es fácil - nueva característica en Django 1.2

Sólo añadir un atributo de la clase de forma & eres bueno para ir. Esta característica se menciona en los documentos en virtud de una nota "de nuevo en 1.2", pero se puede encontrar la magia en django.forms.forms.BoundField.css_classes Aquí está la API reference, y un ejemplo:

class MyForm(forms.Form): 
    required_css_class = "required" 
    error_css_class = "error" 
+1

Estoy ejecutando 1.3 y ninguna de esas clases está alguna vez en la salida de la plantilla. Estoy renderizando el campo con el {{field}} simple en un ciclo for. ¿Algo especial que deba hacer para que funcione? ¿Funciona solo al generar tablas? – Justin

+4

Debe enviar el formulario completo con {{form}}; si lo hace, verá las clases en cualquiera de los formatos (p, tabla y lista). –

+0

@BrianFisher según su respuesta ¿eso significa aceptar {{formulario}} como para obtener el error deseado/clase requerida o crear sus propios elementos si desea un control más fino sobre el formulario completo y las clases en caso de error? – Chris

26

Si desea colocar su clase CSS de error para formar widgets de entrada (no sus contenedores), se puede concluir cuál es su clase de formulario desde el siguiente:

class StyledErrorForm(forms.Form): 
    def is_valid(self): 
     ret = forms.Form.is_valid(self) 
     for f in self.errors: 
      self.fields[f].widget.attrs.update({'class': self.fields[f].widget.attrs.get('class', '') + ' error'}) 
     return ret 
+3

Tenga cuidado con un pequeño error, esto anula cualquier clase especificada en la declaración del widget de campo (es decir, 'attrs'). Para agregar simplemente la clase de error, use esta línea (algo horrible): 'self.fields [f] .widget.attrs.update ({'clase': self.fields [f] .widget.attrs.get ('clase') , '') + 'error'}) ' – gregoltsov

+0

Gracias Gregory, he corregido mi código. – Luca

1

usando una plantilla personalizada ...

Personalmente nunca tuvo mucha suerte con las soluciones de error clasificando incorporada en Django , y además , Me gusta utilizar el filtro de plantillas integrado 'etiquetas de etiquetas' en los errores, para deshacerme de todas las cosas de la lista html que no puedo descifrar cómo renderizar bien de todos modos.

Utilizo la siguiente plantilla personalizada para clasificarlos como 'error_id'.

@register.filter(is_safe=True) 
@stringfilter 
def error_id(value): 
    if value=='': 
     return '' 
    else: 
     return r'<span class="error_id">'+value+'</span>' 

Render los errores individuales en su plantilla usando:

{{ form.my_field.errors|striptags|error_id}} 

O hacer que toda la forma de usar algo como:

<table border="1" cellpadding="5px" align="center"> 
     {% for field in form.visible_fields %} 
      <tr> 
         <td> {{ field.label_tag }}: </td> 
         <td> {{ field }} </td> 
         <td> {{ field.errors|striptags|error_id }} </td> 
      </tr> 

     {% endfor %} 

    </table> 
+1

Uso '{{field.errors.join:" "}}' para mostrar errores en línea en lugar de 'ul'. Y nada de HTML. – Altaisoft

+1

Puede llamar etiquetas de banda dentro de su filtro desde django.template.defaultfilters.stiptags – pymarco

+0

gracias por estos buenos consejos – Ninga

Cuestiones relacionadas