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
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