web-dev-qa-db-fra.com

Django remplace les messages d'erreur de formulaire par défaut

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!

45
Brock

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.

65
Juergen Brendel

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.

8
til

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",
    )
    ....
6
k4ml

Vous voudrez peut-être consulter l'excellent support i18n de Django .

3
c_harm

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

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!

3
Brock

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.

2
zaphod
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.')
0
ohlr