Как перезаписать сообщения об ошибках формы по умолчанию (например: нужно их на другом языке) для всех приложений в моем проекте (или, по крайней мере, для 1 приложения)
Спасибо!
Как перезаписать сообщения об ошибках формы по умолчанию (например: нужно их на другом языке) для всех приложений в моем проекте (или, по крайней мере, для 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)
....
Надеюсь, что это поможет.
Чтобы глобально переопределить обязательное сообщение об ошибке, установите атрибут класса 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 support.
Хм, кажется, нет легкого решения проблемы.
Перемещаясь через код 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 знает, что более изящный способ сделать это, он действительно будет выглядеть так:)
Спасибо!
из книги 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
Скажем, у меня есть BaseForm
с некоторым словарем error_messages
, например:
error_messages = {
'required': 'This field is required',
'caps': 'This field if case sensitive'
}
и я хочу переопределить одно из сообщений об ошибках:
class MySpecialForm(BaseForm):
def __init__(self, *args, **kwargs):
super(MySpecialForm, self).__init__(*args, **kwargs)
self.error_messages['caps'] = 'Hey, that CAPSLOCK is on!!!'
В принципе, просто переопределите одно из значений словаря. Я не уверен, как это будет работать с интернационализацией.
Так как эта страница появляется в поиске, возможно, стоит добавить мои $0.02, хотя вопрос старый. (Я все еще привык к стандартным этикеткам Stack Overflow.)
Подчеркивание ( "_" ) является псевдонимом (если это правильный термин) для ugettext_lazy; просто посмотрите на операторы импорта в верхней части файла с "жестко закодированными" сообщениями. Затем, документы по интернационализации Django должны помочь, например. http://www.djangobook.com/en/2.0/chapter19/