Подтвердить что ты не робот

Django переопределяет сообщения об ошибках формы по умолчанию

Как перезаписать сообщения об ошибках формы по умолчанию (например: нужно их на другом языке) для всех приложений в моем проекте (или, по крайней мере, для 1 приложения)

Спасибо!

4b9b3361

Ответ 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)
    ....

Надеюсь, что это поможет.

Ответ 2

Чтобы глобально переопределить обязательное сообщение об ошибке, установите атрибут класса 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.

Ответ 3

Также приходите сюда из 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",
    )
    ....

Ответ 4

Вы можете посмотреть на Django отлично i18n support.

Ответ 5

Хм, кажется, нет легкого решения проблемы.

Перемещаясь через код 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 знает, что более изящный способ сделать это, он действительно будет выглядеть так:)

Спасибо!

Ответ 6

из книги 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

Ответ 7

Скажем, у меня есть 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!!!'

В принципе, просто переопределите одно из значений словаря. Я не уверен, как это будет работать с интернационализацией.

Ответ 8

Так как эта страница появляется в поиске, возможно, стоит добавить мои $0.02, хотя вопрос старый. (Я все еще привык к стандартным этикеткам Stack Overflow.)

Подчеркивание ( "_" ) является псевдонимом (если это правильный термин) для ugettext_lazy; просто посмотрите на операторы импорта в верхней части файла с "жестко закодированными" сообщениями. Затем, документы по интернационализации Django должны помочь, например. http://www.djangobook.com/en/2.0/chapter19/