Django: Как переопределить сообщение об ошибке unique_together? - PullRequest
19 голосов
/ 22 октября 2010

В мета-классе модели я определяю unique_together.У меня есть ModelForm на основе этой модели.Когда я вызываю is_valid для этой ModelForm, автоматически возникает ошибка, если проверка unique_together не удалась.Это все хорошо.

Теперь моя проблема в том, что меня не устраивает стандартное сообщение об ошибке unique_together.Я хочу переопределить это.Как я могу это сделать?Для ошибки, связанной с полем, я легко могу сделать это, установив error_messages в параметрах поля.Но unique_together - это ошибка не поля.Как я могу переопределить сообщение об ошибке не в поле?

Ответы [ 5 ]

35 голосов
/ 24 марта 2014

Вы можете сделать это в Django 1.7

from django.forms import ModelForm
from django.core.exceptions import NON_FIELD_ERRORS

class ArticleForm(ModelForm):
    class Meta:
        error_messages = {
            NON_FIELD_ERRORS: {
                'unique_together': "%(model_name)s's %(field_labels)s are not unique.",
            }
        }
25 голосов
/ 13 июля 2011

Обновление 2016/10/20 : См. jifeng-yin , еще более хороший ответ ниже для Django> = 1.7

Самый хороший способ переопределить эту ошибкусообщения могут переопределить метод unique_error_message в вашей модели.Django вызывает этот метод, чтобы получить сообщение об ошибке всякий раз, когда во время проверки возникает проблема уникальности.

Вы можете просто обработать конкретный случай, который вам нужен, и позволить Django обрабатывать все другие случаи как обычно:

def unique_error_message(self, model_class, unique_check):
    if model_class == type(self) and unique_check == ('field1', 'field2'):
        return 'My custom error message'
    else:
        return super(Project, self).unique_error_message(model_class, unique_check)
1 голос
/ 22 октября 2010

После быстрой проверки кажется, что unique_together ошибки проверки жестко запрограммированы глубоко в django.db.models.Model.unique_error_message:

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)
        }

Так что, возможно, вам следует попробовать переопределить этот метод в вашей модели, чтобы вставить собственное сообщение!?

Однако я не пробовал, и это кажется довольно жестоким решением! Но если у вас нет ничего лучше, вы можете попробовать ...

0 голосов
/ 22 октября 2010

Вы можете взглянуть на переопределение django / db / models / base.py: Model._perform_unique_checks () в вашей модели.

В этом методе вы можете получить «оригинальные» ошибки:

    errors = super(MyModel, self)._perform_unique_checks(unique_checks)

- затем измените и верните их вверх.

0 голосов
/ 22 октября 2010

Примечание: Многое изменилось в Django с момента этого ответа.Поэтому лучше проверьте другие ответы ...

Если то, что sebpiq является истинным (поскольку я не проверяю исходный код), то есть одно возможное решение, которое вы можете сделать, но это трудный путь ...

Вы можете определить правило проверки в своей форме, , как описано здесь

Вы можете увидеть примеров проверки с более чем одним полем, поэтомуиспользуя этот метод, вы можете определить уникальную проверку вместе перед выполнением стандартной проверки уникальности django ...

Или, что еще хуже, вы можете выполнить проверку в своем представлении, прежде чем пытаться сохранить объекты ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...