web-dev-qa-db-ja.com

Djangoデフォルトのフォームエラーメッセージを上書き

プロジェクト内のすべてのアプリ(または少なくとも1つのアプリ)のデフォルトフォームエラーメッセージ(たとえば、他の言語でそれらを必要とする)を上書きする方法

ありがとう!

48
Brock

最も簡単な方法は、デフォルトのエラーセットをフォームフィールド定義に提供することです。フォームフィールドは、名前付き引数を取ることができます。例えば:

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

お役に立てれば。

69
Juergen Brendel

「必須」エラーメッセージをグローバルにオーバーライドするには、Fieldでdefault_error_messagesクラス属性を設定します。

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

これは、フィールドがインスタンス化される前に発生する必要があります。 settings.pyに含めてください。

8
til

また、Googleからここに来て、新しいフォームフィールドを定義するたびにerror_messages引数を渡すのではなく、フォーム内のすべてのフィールドのデフォルトの必須メッセージを上書きする必要があります。また、私はまだi18nを掘り下げる準備ができていません。このアプリは多言語である必要はありません。このブログ投稿のコメントは、私が望むものに最も近いものです。

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

メッセージが必要なすべてのフォームフィールドについて、これは私がやったことです-

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

Djangoの優れた i18nサポート をご覧ください。

3
c_harm

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

うーん、問題の簡単な回避策はないようです。

Djangoコードをざっと見て、デフォルトのエラーメッセージが各フォームフィールドクラスにハードコードされていることがわかりました。たとえば:

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

そして、最も簡単な方法は、error_messages引数なので、ラッパー関数を作成する必要がありました。

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)

Smdbがこれを行うためのよりエレガントな方法を知っているなら、それを見るのは本当に感謝するでしょう:)

ありがとう!

3
Brock

BaseFormerror_messagesのような辞書:

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

そして、私はエラーメッセージの1つを上書きしたい:

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

基本的に、辞書の値の1つをオーバーライドするだけです。しかし、国際化でどのように機能するかはわかりません。

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