プロジェクト内のすべてのアプリ(または少なくとも1つのアプリ)のデフォルトのフォームエラーメッセージ(たとえば、他の言語でそれらが必要)を上書きするにはどうすればよいですか?
ありがとう!
最も簡単な方法は、一連のデフォルト エラーをフォーム フィールド定義に提供することです。フォーム フィールドは、名前付き引数を取ることができます。例えば:
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)
....
お役に立てれば。
また、グーグルからここに来て、私が必要とするのは、新しいフォームフィールドを定義するたびに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",
)
....
私が次のような辞書を持っている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つをオーバーライドするだけです。しかし、それが国際化でどのように機能するかはわかりません。
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
Django の優れたi18n サポートを参照してください。
うーん、問題の簡単な回避策はないようです。
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)
誰かがこれを行うためのよりエレガントな方法を知っているなら、それを見て本当に感謝します:)
ありがとう!
このページは検索結果に表示されるので、質問が古い場合でも、おそらく$0.02を追加する価値があります。(私はまだStack Overflowの特定のエチケットに慣れています。)
アンダースコア( "_")は、ugettext_lazyのエイリアス(正しい用語の場合)です。「ハードコードされた」メッセージが含まれているファイルの上部にあるインポートステートメントを確認してください。次に、Djangoの国際化ドキュメントが役立つはずです(例:http ://www.djangobook.com/en/2.0/chapter19/)