python - формы - Проверка полей модели Django




django формы (3)

Если я понимаю вас «четко» - вы должны переопределить функцию get_db_prep_save вместо to_python

Где должна проходить проверка полей модели в джанго?

Я мог бы назвать как минимум два возможных варианта: в перегруженном методе .save () модели или в методе .to_python () моделей. Подкласс подкласса (очевидно, для этого нужно писать пользовательские поля).

Возможные варианты использования:

  • когда абсолютно необходимо гарантировать, что пустая строка не будет записана в базу данных (пустой = аргумент ключевого слова False здесь не работает, это только для проверки формы)
  • когда необходимо гарантировать, что аргумент ключевого слова «выбор» получает уважение на уровне db, а не только в интерфейсе администратора (тип эмуляции типа данных перечисления)

В empty_strings_allowed также есть атрибут class-level empty_strings_allowed Определение базового класса Field и производные классы с радостью переопределяют его, однако оно, похоже, не влияет на уровень базы данных, то есть я все же могу построить модель с пустой строкой полей и сохранить их в базе данных. Который я хочу избежать (да, это необходимо).

Возможные реализации

на полевом уровне:

class CustomField(models.CharField):
    __metaclass__ = models.SubfieldBase
    def to_python(self, value):
        if not value:
            raise IntegrityError(_('Empty string not allowed'))
        return models.CharField.to_python(self, value)

на уровне модели:

class MyModel(models.Model)
    FIELD1_CHOICES = ['foo', 'bar', 'baz']
    field1 = models.CharField(max_length=255, 
               choices=[(item,item) for item in FIELD1_CHOICES])

    def save(self, force_insert=False, force_update=False):
        if self.field1 not in MyModel.FIELD1_CHOICES:
            raise IntegrityError(_('Invalid value of field1'))
        # this can, of course, be made more generic
        models.Model.save(self, force_insert, force_update)

Возможно, я что-то упустил, и это можно сделать проще (и чище)?


Коренной проблемой для этого является то, что валидация должна выполняться на моделях. Это довольно долго обсуждалось в django (проверка достоверности формы формы поиска в списке рассылки Dev). Это приводит либо к дублированию, либо к тому, что ускользает от проверки, прежде чем ударить db.

Хотя это не касается сундука, решение Малкольма «Решение о проверке модели бедных людей» , вероятно, является самым чистым решением, чтобы не повторять себя.


Я думаю, вы этого хотите ->

from django.db.models.signals import pre_save

def validate_model(sender, **kwargs):
    if 'raw' in kwargs and not kwargs['raw']:
        kwargs['instance'].full_clean()

pre_save.connect(validate_model, dispatch_uid='validate_models')

(Скопировано из http://djangosnippets.org/snippets/2319/ )





django-models