it-swarm.com.de

Django überschreibt Standard-Formularfehlermeldungen

Wie kann ich die Standardformularfehlermeldungen für alle Apps in meinem Projekt (oder mindestens für eine App) überschreiben (z. B. in anderen Sprachen)?

Vielen Dank!

45
Brock

Am einfachsten ist es, Ihre Standardfehler für die Formularfelddefinition anzugeben. Formularfelder können ein benanntes Argument dafür annehmen. Zum Beispiel:

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

Hoffe das hilft.

65
Juergen Brendel

Um die "erforderliche" Fehlermeldung global zu überschreiben, setzen Sie das Klassenattribut default_error_messages auf Field:

# 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."),
}

Dies muss geschehen, bevor Felder instanziiert werden, z. indem Sie es in settings.py aufnehmen.

8
til

Kommen Sie auch hier von Google, und ich muss die standardmäßig erforderlichen Nachrichten für alle Felder in meinem Formular überschreiben, anstatt das Argument error_messages zu übergeben, wenn ich neue Formularfelder definiere. Ich bin auch noch nicht bereit, mich mit i18n zu beschäftigen. Diese Apps müssen nicht mehrsprachig sein. Der Kommentar in diesem Blog-Post ist dem, was ich will, am nächsten: -

http://davedash.com/2008/11/28/custom-error-messages-for-Django-forms/

Für alle Formularfelder, für die Nachrichten erforderlich sind, habe ich Folgendes getan: -

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

Vielleicht möchten Sie sich Djangos hervorragenden i18n-Support anschauen.

3
c_harm

aus ProDjango Buch:

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, scheint es keine einfache Lösung für das Problem zu geben.

Beim Durchlaufen des Django-Codes habe ich festgestellt, dass Standardfehlermeldungen in jeder Formularfeldklasse hartcodiert sind, zum Beispiel:

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).'),
    }

Und am einfachsten ist es, das Argument error_messages zu verwenden, also musste ich die Wrapper-Funktion schreiben:

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)

Wenn smdb weiß, dass es eine elegantere Art und Weise gibt, wäre dies wirklich sehr erfreulich, es zu sehen :)

Vielen Dank!

3
Brock

Angenommen, ich habe eine BaseForm mit einem error_messages-Wörterbuch wie:

error_messages = {
    'required': 'This field is required',
    'caps': 'This field if case sensitive' 
}

und ich möchte eine der Fehlermeldungen überschreiben:

class MySpecialForm(BaseForm):
    def __init__(self, *args, **kwargs):
        super(MySpecialForm, self).__init__(*args, **kwargs)
        self.error_messages['caps'] = 'Hey, that CAPSLOCK is on!!!'

Grundsätzlich überschreiben Sie einfach einen der Wörterbuchwerte. Ich bin mir nicht sicher, wie es mit der Internationalisierung funktionieren würde.

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