2009-10-06 7 views

Respuesta

28

Los campos del formulario son fáciles de personalizar:

class UpperCaseField(forms.CharField): 
    def clean(self, value) 
     try: 
      return value.upper() 
     except: 
      raise ValidationError 

, básicamente, que acaba de crear una clase que hereda de la materia que más se parece a lo que desea, vuelva a grabar el método clean() para que devuelva el valor que querer. He aquí otro ejemplo:

class MyObjectField(forms.ModelChoiceField): 
    # in this case, 'value' is a string representing 
    # the primary key of a MyObject 
    def clean(self, value): 
     try: 
      return MyObject.objects.get(pk=value) 
     except: 
      raise ValidationError 

encargo widgets de, por otro lado, son un poco más útil, pero un poco más difícil de hacer porque hay unos cuantos métodos que necesitan ser escritas para que funcionen suavemente.

+1

Gracias. Creo que necesito escribir un widget personalizado porque necesito personalizar el renderizado del campo. –

+7

Nota: clean() es responsable de ejecutar to_python(), validate() y run_validators(). Si anula clean() y no implementa esto, lo arruinará. – orokusaki

+3

orokusaki tiene razón, si invalida clean(), al menos debería llamarlo su implementación súper con 'super (UpperCaseField, self) .clean (value)' –

7

No es un tutorial, pero docs conversaciones de Django sobre esto un poco:

Si el incorporado en las clases de campo no satisfacer sus necesidades, usted puede crear fácilmente clases personalizadas de campo. Para hacer esto, solo crea una subclase de django.forms.Field. Sus únicos requisitos son que implementa un método clean() y que su método __init__() acepta los argumentos básicos mencionados anteriormente (obligatorio, etiqueta, inicial, widget, help_text).

Puede leer sobre el método de limpieza y ver un ejemplo at the django docs. Nuevamente, no es un tutorial, pero es útil.

Me parece que estoy aprendiendo mucho leyendo el código en algunos de los proyectos de la aplicación django que están disponibles, como django-extensions, que anulan los campos del formulario y son buenas herramientas de aprendizaje (para mí, al menos). Esto puede ayudarlo a comenzar.

14

Como siempre con el código de código abierto, aprenderá mucho leyendo la fuente en sí. Consulte el módulo django.forms.fields para ver cómo se definen todos los campos de formulario diferentes; la mayoría de ellos ya son subclases de otros, de modo que puede replicar eso y cambiar lo que necesita.

+8

Un enlace a la última fuente: https://github.com/django/django/blob/master/django/forms/fields.py –

Cuestiones relacionadas