Сообщение об ошибке 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).
Ответ 4
Так как Django 1.4 точный пример, который вы поставляете, действительно работает. Может быть, они нашли ваш отчет об ошибке и только что зафиксировали его?
https://github.com/django/django/blob/1.4.20/django/db/models/base.py#L780