widgets - Django anula los mensajes de error de formulario predeterminados
django model form (8)
¿Cómo puedo sobrescribir los mensajes de error de forma predeterminada (por ejemplo: los necesito en otro idioma) para todas las aplicaciones de mi proyecto (o al menos para 1 aplicación)?
¡Gracias!
Como esta página aparece en una búsqueda, quizás valga la pena agregar mi $ 0.02 aunque la pregunta sea antigua. (Todavía me estoy acostumbrando a la etiqueta particular de .)
El guión bajo ("_") es un alias (si ese es el término correcto) para ugettext_lazy; solo mire las declaraciones de importación en la parte superior del archivo con mensajes "codificados". Entonces, los documentos de internacionalización de Django deberían ayudar, por ejemplo, http://www.djangobook.com/en/2.0/chapter19/
Digamos que tengo un BaseForm
con algún diccionario de BaseForm
como:
error_messages = {
''required'': ''This field is required'',
''caps'': ''This field if case sensitive''
}
y quiero anular uno de los mensajes de error:
class MySpecialForm(BaseForm):
def __init__(self, *args, **kwargs):
super(MySpecialForm, self).__init__(*args, **kwargs)
self.error_messages[''caps''] = ''Hey, that CAPSLOCK is on!!!''
Básicamente, simplemente anule uno de los valores del diccionario. Aunque no estoy seguro de cómo funcionaría con la internacionalización.
Es posible que desee ver el excelente soporte i18n de Django.
Hmm, parece que no hay una solución fácil para el problema.
Mientras navego por el código de django, descubrí que los mensajes de error predeterminados están codificados de forma rígida en cada clase de campo de formulario, por ejemplo:
class CharField(Field):
default_error_messages = {
''max_length'': _(u''Ensure this value has at most %(max)d characters (it has %(length)d).''),
''min_length'': _(u''Ensure this value has at least %(min)d characters (it has %(length)d).''),
}
Y la forma más fácil es usar el argumento error_messages
, así que tuve que escribir la función de contenedor:
def DZForm(name, args = {}):
error_messages = {
''required'': u''required'',
''invalid'': u''invalid'',
}
if ''error_messages'' in args.keys():
args[''error_messages''] = error_messages.update(args[''error_messages''])
else:
args[''error_messages''] = error_messages
return getattr(forms, name)(**args)
Si smdb sabe más elegent manera de hacer esto realmente apreciaría verlo :)
¡Gracias!
La forma más fácil es proporcionar su conjunto de errores predeterminados a la definición del campo de formulario. Los campos de formulario pueden tomar un argumento con nombre para ello. Por ejemplo:
my_default_errors = {
''required'': ''This field is required'',
''invalid'': ''Enter a valid value''
}
class MyForm(forms.Form):
some_field = forms.CharField(error_messages=my_default_errors)
....
Espero que esto ayude.
Para anular globalmente el mensaje de error "requerido", establezca el atributo de clase default_error_messages en el campo:
# form error message override
from django.forms import Field
from django.utils.translation import ugettext_lazy
Field.default_error_messages = {
''required'': ugettext_lazy("This field is mandatory."),
}
Esto debe suceder antes de que se creen instancias de ningún campo, por ejemplo, incluyéndolo en settings.py.
También vengo desde google y lo que necesito es sobrescribir los mensajes requeridos por defecto para todos los campos en mi formulario en lugar de pasar el argumento error_messages cada vez que definí nuevos campos de formulario. Además, todavía no estoy listo para profundizar en i18n, estas aplicaciones no requieren ser multilingües. El comentario en esta publicación de blog es el más cercano a lo que quiero: -
http://davedash.com/2008/11/28/custom-error-messages-for-django-forms/
Para todos los campos de formulario que tienen mensajes requeridos, esto es lo que hice:
class MyForm(forms.Form):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
for k, field in self.fields.items():
if ''required'' in field.error_messages:
field.error_messages[''required''] = ''You have to field this.''
class MUserForm(MyForm):
user = forms.CharField(
label="Username",
)
....
del libro de ProDjango:
from django.forms import fields, util
class LatitudeField(fields.DecimalField):
default_error_messages = {
''out_of_range'': u''Value must be within -90 and 90.'',
}
def clean(self, value):
value = super(LatitudeField, self).clean(value)
if not -90 <= value <= 90:
raise util.ValidationError(self.error_messages[''out_of_range''])
return value