with tutorial the para latest framework espaƱol desde cero applications django django-forms

tutorial - the django project



mensajes de error personalizados con formulario modelo (7)

Para casos simples, puede especificar mensajes de error personalizados

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

Puedo ver cómo agregar un mensaje de error a un campo al usar formularios, pero ¿qué pasa con la forma del modelo?

Este 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: first_name y last_name es "Este campo es obligatorio". ¿Cómo cambio eso en un formulario modelo?


la forma más fácil es anular el método de limpieza:

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


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

Podrás 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ás buscando, ¿verdad?


Otra manera fácil de hacerlo es anularla 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!''}


Tengo una solución más limpia, basada 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


Nuevo en 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 error_messages options se pueden usar para personalizar los campos predeterminados, ver Anulación de los campos predeterminados 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."), }, }

Relacionado: ModelForm de Django : ¿dónde está la lista de opciones Meta?


Puede verificar y poner fácilmente un mensaje de error personalizado anulando clean() método clean() y usando 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