Comment remplacer les messages d'erreur de formulaire par défaut (par exemple: besoin de les utiliser dans une autre langue) pour toutes les applications de mon projet (ou au moins pour une application)
Merci!
Le moyen le plus simple consiste à fournir votre ensemble d'erreurs par défaut à la définition du champ de formulaire. Les champs de formulaire peuvent prendre un argument nommé. Par exemple:
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)
....
J'espère que cela t'aides.
Pour remplacer globalement le message d'erreur "requis", définissez l'attribut de la classe default_error_messages sur la zone:
# 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."),
}
Cela doit se produire avant que des champs ne soient instanciés, par exemple. en l'incluant dans settings.py.
Vient également ici de Google. Ce dont j'ai besoin, c’est d’écraser les messages obligatoires par défaut pour tous les champs de mon formulaire plutôt que de transmettre l’argument error_messages chaque fois que j’ai défini de nouveaux champs de formulaire. De plus, je ne suis pas encore prêt à fouiller dans i18n, cette application n'étant pas obligée d'être multilingue. Le commentaire dans ce blog est le plus proche de ce que je veux: -
http://davedash.com/2008/11/28/custom-error-messages-for-Django-forms/
Voici ce que j'ai fait pour tous les champs de formulaire contenant des messages obligatoires: -
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",
)
....
Vous voudrez peut-être consulter l'excellent support i18n de Django .
du livre 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
Hmm, il semble qu'il n'y ait pas de solution de rechange facile au problème.
En parcourant le code Django, j'ai constaté que les messages d'erreur par défaut sont codés en dur dans chaque classe de champ de formulaire, par exemple:
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).'),
}
Et le moyen le plus simple est d'utiliser l'argument error_messages
. J'ai donc dû écrire la fonction d'emballage:
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 connaissait une façon plus élégante de le faire, il serait très utile de le voir :)
Merci!
Disons que j'ai une BaseForm
avec un dictionnaire error_messages
comme:
error_messages = {
'required': 'This field is required',
'caps': 'This field if case sensitive'
}
et je veux remplacer l'un des messages d'erreur:
class MySpecialForm(BaseForm):
def __init__(self, *args, **kwargs):
super(MySpecialForm, self).__init__(*args, **kwargs)
self.error_messages['caps'] = 'Hey, that CAPSLOCK is on!!!'
Fondamentalement, il suffit de remplacer l'une des valeurs du dictionnaire. Je ne sais pas comment cela fonctionnerait avec l'internationalisation.
from Django import forms
from Django.utils.translation import gettext as _
class MyForm(forms.Form):
# create form field
subject = forms.CharField(required=True)
# override one specific error message and leave the others unchanged
# use gettext for translation
subject.error_messages['required'] = _('Please enter a subject below.')