Сообщение об ошибке Django, отображаемое для уникальных полей

Я хотел бы изменить сообщение об ошибке по умолчанию, когда повторяющиеся записи попытаются сохранить, когда они должны быть уникальными, т.е. unique=True. Примерно так:

email = models.EmailField(unique=True, error_messages={'unique':"This email has already been registered."})

Но, unique в приведенном выше случае было догадкой и не работает. Я также не могу узнать, что такое имя ошибки. Кто-нибудь знает правильное имя?

Обратите внимание: эта проверка является уровнем модели, а не проверкой формы.

EDIT: Немного больше информации, в настоящий момент текущее сообщение об ошибке отображается form.errors:

[model_name] with this [field_label] already exists

Что не очень удобно, поэтому я хотел бы переопределить его...

Ответы

Ответ 1

Это сообщение об ошибке, по-видимому, жестко закодировано в файле django/db/models/base.py.

def unique_error_message(self, model_class, unique_check):
    opts = model_class._meta
    model_name = capfirst(opts.verbose_name)

    # A unique field
    if len(unique_check) == 1:
        field_name = unique_check[0]
        field_label = capfirst(opts.get_field(field_name).verbose_name)
        # Insert the error into the error dict, very sneaky
        return _(u"%(model_name)s with this %(field_label)s already exists.") %  {
            'model_name': unicode(model_name),
            'field_label': unicode(field_label)
        }
    # unique_together
    else:
        field_labels = map(lambda f: capfirst(opts.get_field(f).verbose_name), unique_check)
        field_labels = get_text_list(field_labels, _('and'))
        return _(u"%(model_name)s with this %(field_label)s already exists.") %  {
            'model_name': unicode(model_name),
            'field_label': unicode(field_labels)
        }

Один из способов решения этой проблемы - создать свою пользовательскую модель, полученную из EmailField, и переопределить метод unique_error_message. Но будьте осторожны, что это может повредить вещи при обновлении до более новых версий Django.

Ответ 2

Большое спасибо.

email = models.EmailField(unique=True, error_messages={'unique':"This email has already been registered."})

теперь это работало очень хорошо.

Если вы хотите настроить error_messages, например invalided, сделайте это в forms.ModelForm

email = forms.EmailField(error_messages={'invalid': 'Your email address is incorrect'})

Но сообщение unique должно быть настроено в поле model, как указано в ben

email = models.EmailField(unique=True, error_messages={'unique':"This email has already been registered."})

Ответ 3

Уникальное сообщение об ошибке создается django.db.models.base.unique_error_message (по крайней мере, на Django 1.3).