Джанго: Могут ли models.Field.validate () для всей проверки сэкономить много кода? - PullRequest
4 голосов
/ 22 января 2010

Я думаю об этом все неправильно , или я что-то упускаю это действительно очевидно?

Руководство по стилю Python гласит: чем меньше кода, тем лучше (и я не думаю, что это субъективно ... Это факт), так что учтите это.

Использование форм для всей проверки означает, что для написания подкласса поля модели с пользовательской проверкой вам необходимо:

  1. Подкласс моделей. Поле
  2. Подкласс форм. Поле
  3. Добавление пользовательской проверки к вашим формам. Подкласс поля
  4. Установите поле пользовательской формы в качестве поля формы по умолчанию для поля пользовательской модели
  5. Всегда используйте форму модели django, если вы хотите выполнить проверку

При всей проверке в модели вам просто нужно:

  1. Подкласс моделей. Поле
  2. Добавить пользовательскую проверку для ваших моделей. Подкласс поля

Теперь вы можете использовать поле модели в API, который обходит все формы использования веб-форм, и вы все равно будете иметь проверку на самом низком уровне. Если вы используете веб-формы, проверка будет распространяться вверх.

Есть ли способ сделать это без необходимости писать команду Django и ждать, пока они исправят эту ошибку?

Ответы [ 2 ]

2 голосов
/ 22 января 2010

Подобные вещи уже возможны в разрабатываемой версии Django:

Существует три этапа проверки модель, и все три называются метод модели full_clean(). Большинство время этот метод будет вызван автоматически на ModelForm. Вам нужно только позвоните full_clean(), если вы планируете обрабатывать ошибки проверки самостоятельно.

См. Документы .

например. (как часть вашего модельного класса):

def clean(self):
    from django.core.exceptions import ValidationError
    # Don't allow draft entries to have a pub_date.
    if self.status == 'draft' and self.pub_date is not None:
        raise ValidationError('Draft entries may not have a publication date.')
    # Set the pub_date for published items if it hasn't been set already.
    if self.status == 'published' and self.pub_date is None:
        self.pub_date = datetime.datetime.now()

Процесс проверки ModelForm вызовет метод clean вашей модели, для this :

В рамках процесса проверки ModelForm вызовет метод clean() каждого поля в вашей модели, которая имеет соответствующее поле в вашей форме. Если Вы исключили любые модельные поля, проверка не будет выполняться на тех, поля. Также, метод вашей модели clean() будет вызывается перед проверкой уникальности сделаны. См. Проверка объектов для больше информации о модели clean() крючок.

1 голос
/ 22 января 2010

Это уже исправлено и будет в Django 1.2.

...