60

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

ありがとう!

4

9 に答える 9

87

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

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

お役に立てれば。

于 2009-09-28T18:40:05.427 に答える
7

また、グーグルからここに来て、私が必要とするのは、新しいフォームフィールドを定義するたびに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",
    )
    ....
于 2011-01-21T23:22:42.693 に答える
3

私が次のような辞書を持っているBaseFormとしましょう:error_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つをオーバーライドするだけです。しかし、それが国際化でどのように機能するかはわかりません。

于 2012-12-31T22:30:44.073 に答える
3

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
于 2013-09-12T07:27:51.447 に答える
3

Django の優れたi18n サポートを参照してください。

于 2009-09-26T18:16:39.757 に答える
3

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

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)

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

ありがとう!

于 2009-09-28T08:52:08.000 に答える
-6

このページは検索結果に表示されるので、質問が古い場合でも、おそらく$0.02を追加する価値があります。(私はまだStack Overflowの特定のエチケットに慣れています。)

アンダースコア( "_")は、ugettext_lazyのエイリアス(正しい用語の場合)です。「ハードコードされた」メッセージが含まれているファイルの上部にあるインポートステートメントを確認してください。次に、Djangoの国際化ドキュメントが役立つはずです(例:http ://www.djangobook.com/en/2.0/chapter19/)

于 2010-07-20T08:37:08.020 に答える