プロジェクト内のすべてのアプリ(または少なくとも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)
....
お役に立てれば。
「必須」エラーメッセージをグローバルにオーバーライドするには、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に含めてください。
また、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",
)
....
Djangoの優れた i18nサポート をご覧ください。
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コードをざっと見て、デフォルトのエラーメッセージが各フォームフィールドクラスにハードコードされていることがわかりました。たとえば:
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がこれを行うためのよりエレガントな方法を知っているなら、それを見るのは本当に感謝するでしょう:)
ありがとう!
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つをオーバーライドするだけです。しかし、国際化でどのように機能するかはわかりません。
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.')