Внешне добавить ошибки формы в Django - PullRequest
6 голосов
/ 11 октября 2010

У меня есть форма Django, которая добавляет запись в базу данных с уникальным ограничением на один из столбцов. Если происходит попытка создания дубликата, я получаю django.db.utls.IntegrityError о том, что нарушил ограничение уникальности (к счастью).

При обработке форм Django существует несколько способов проверки:

  1. Переопределить класс формы 'clean метод
  2. Переопределить класс формы 'clean_<field>, метод

Если метод clear_<field> вызывает значение django.forms.ValidationError, сообщение об ошибке будет добавлено в список в словаре _errors под именем поля. При использовании метода clean ошибки должны быть вставлены вручную в _errors dict.

Теперь методы clean и clean_<field> не кажутся хорошим местом для размещения кода с побочными эффектами, и я боюсь, что проверка на данный момент уникальности значения не гарантирует, что я не буду получить IntegrityError с. Я бы предпочел на самом деле попытаться создать строку в базе данных и сообщить об ошибке формы при нарушении ограничения.

Моя основная проблема заключается в том, что формы предоставляют публичную собственность errors, которая только для чтения . Поэтому я должен, согласно документам, добавить в мою форму метод, который выполняет всю работу, попытаться вставить его в базу данных и зарегистрировать ошибку при возникновении IntegrityError. Поскольку действие, которое обрабатывает форму после проверки, требует большого количества других данных, я не хочу помещать код в сам класс формы.

Есть ли какой-либо другой (задокументированный или нет) способ добавить запись в errors извне из класса, или я должен просто получить доступ к _errors «закрытой» переменной и быть довольным этим? Я знаю, это звучит как нарушение ООП, но создание дополнительного метода только для доступа к этой «закрытой» переменной не кажется мне таким, как будто кто-то от кого-то ограждает.

Edit: Похоже, кто-то другой уже поднял аналогичный вопрос , но, похоже, ответы указывают на ручную вставку в _errors ...

Ответы [ 2 ]

7 голосов
/ 19 октября 2010

На данный момент простое решение выглядит следующим образом:

try:
    # Try to save model instance, which might throw `IntegrityError`.
    # ...
except django.db.utils.IntegrityError:
    # The form passed validation so it has no errors.
    # Use the `setdefault` function just in case.
    errors = django.forms.util.ErrorList()
    errors = form._errors.setdefault(
        django.forms.forms.NON_FIELD_ERRORS, errors)
    errors.append('Sorry, this username is already in use.')
0 голосов
/ 12 октября 2010

Я думаю, что добавление метода в форму вполне разумно. Класс ModelForm, который имеет метод save (), который выполняет логику сохранения созданного экземпляра в базе данных. Если ваша форма может быть унаследована от ModelForm (или просто добавить метод save () в вашу форму), вы все равно будете в пределах «джангонских» стандартов.

http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

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