2010-08-09 34 views
35

puedo ver cómo agregar un mensaje de error a un campo cuando se utilizan formas, pero ¿qué pasa con forma de modelo?mensajes de error personalizados con Formulario tipo

Ésta es mi modelo de prueba

class Author(models.Model): 
    first_name = models.CharField(max_length=125) 
    last_name = models.CharField(max_length=125) 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

Mi modelo de formulario

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

El mensaje de error en los campos: nombre apellido y apellidos es "Este campo es obligatorio". ¿Cómo cambio eso en un formulario modelo?

Respuesta

29

Para los casos simples, puede specify custom error messages

class AuthorForm(forms.ModelForm): 
    first_name = forms.CharField(error_messages={'required': 'Please let us know what to call you!'}) 
    class Meta: 
     model = Author 
+1

frescos gracias. No sabía cuál sería el resultado de hacer eso. La documentación dice "Los campos declarados anularán los predeterminados generados al usar el atributo del modelo", así que debería estar bien.También tendría que volver a establecer max_field en el campo de formulario modelo. – iJK

+15

¿Es realmente necesario repetir las declaraciones de campo en el formulario? ¿Qué tal el principio DRY django está orgulloso? – paweloque

+0

Esto no funciona: https://code.djangoproject.com/ticket/13693 – fjsj

7

la manera mas facil es reemplazar el método limpio:

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 
    def clean(self): 
     if self.cleaned_data.get('name')=="": 
     raise forms.ValidationError('No name!') 
     return self.cleaned_data 
15

me han preguntado acerca de esto muchas veces también. Es por eso que finalmente escribí una pequeña extensión a la clase ModelForm, lo que me permite establecer los atributos de campo arbitraria - incluyendo los mensajes de error - a través de la clase Meta. El código y la explicación se puede encontrar aquí: http://blog.brendel.com/2012/01/django-modelforms-setting-any-field.html

Usted será capaz de hacer cosas como esta:

class AuthorForm(ExtendedMetaModelForm): 
    class Meta: 
     model = Author 
     field_args = { 
      "first_name" : { 
       "error_messages" : { 
        "required" : "Please let us know what to call you!" 
       } 
      } 
     } 

creo que eso es lo que está buscando, ¿verdad?

+0

Esta es una gran manera de hacer esto. Sin duda, más DRY que la redefinición de los campos de formulario. – suda

+0

@suda no está realmente redefiniendo, está anulando el comportamiento predeterminado basado en el modelo asociado. similar a cambiar una entrada a un área de texto, está anulando el valor predeterminado. – Chris

14

Otra manera fácil de hacer esto es simplemente anularlo en init.

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

    def __init__(self, *args, **kwargs): 
     super(AuthorForm, self).__init__(*args, **kwargs) 

     # add custom error messages 
     self.fields['name'].error_messages = {'required': 'Please let us know what to call you!'} 
+0

Esto funciona, definitivamente lo habría aceptado como respuesta – Zac

+1

Esta es una solución mucho mejor que ninguna otra en este hilo porque 1) No tiene que usar ninguna extensión 2) no tiene que volver a escribir la definición de campo de formulario completo porque depende en la definición del campo modelo. +1 –

+2

Una nota pensada, debes usarla así 'self.fields ['name']. Error_messages ['required'] = '¡Por favor, háganos saber cómo llamarlo!' 'O usando' .update() 'método; de lo contrario, restablece todos los demás mensajes de error. –

35

New in Django 1.6:

ModelForm acepta varias nuevas opciones Meta.

  • Los campos incluidos en la lista localized_fields se localizarán (al configurar localize en el campo de formulario).
  • Las etiquetas, help_texts y opciones error_messages se pueden utilizar para personalizar los campos predeterminados, consulte Overriding the default fields para más detalles.

A partir de ese:

class AuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = ('name', 'title', 'birth_date') 
     labels = { 
      'name': _('Writer'), 
     } 
     help_texts = { 
      'name': _('Some useful help text.'), 
     } 
     error_messages = { 
      'name': { 
       'max_length': _("This writer's name is too long."), 
      }, 
     } 

relacionadas: Django's ModelForm - where is the list of Meta options?

+0

no entiendo el _() que rodea el texto del mensaje de error personalizado, así que lo eliminé. pero este es el primer fragmento que funcionó para mí. estoy en django 1.6. ¡gracias Señor! –

+2

¡De nada! Si tiene curiosidad, la función de subrayado es un atajo común para una utilidad de internacionalización: http://stackoverflow.com/questions/2964244/django-meaning-of-leading-underscore-in-list-of-tuples-used- para-definir-elección-fi – doctaphred

4

que tienen una solución más limpia, basado en la respuesta de jamesmfriedman. Esta solución es aún más SECA, especialmente si tiene muchos campos.

custom_errors = { 
    'required': 'Your custom error message' 
} 

class AuthorForm(forms.ModelForm): 
    class Meta: 
     model = Author 

    def __init__(self, *args, **kwargs): 
     super(AuthorForm, self).__init__(*args, **kwargs) 

     for field in self.fields: 
      self.fields[field].error_messages = custom_errors 
1

Puede comprobar fácilmente y poner mensaje de error personalizado reemplazando clean() método y utilizando self.add_error(field, message):

def clean(self): 
    super(PromotionForm, self).clean() 
    error_message = '' 
    field = '' 
    # reusable check 
    if self.cleaned_data['reusable'] == 0: 
     error_message = 'reusable should not be zero' 
     field = 'reusable' 
     self.add_error(field, error_message) 
     raise ValidationError(error_message) 

    return self.cleaned_data 
Cuestiones relacionadas