Разделение ввода формы и проверки модели в Django?

Является ли типичным отделить проверку ввода от проверки уровня модели в проектах Django? Например, подтверждение того, что имя пользователя соответствует критериям именования, будет проверкой ввода, а проверка того, что пользователь еще не находится в базе данных, будет проверкой на уровне модели.

Я смотрю код со-работника, и они ставят оба типа проверки в класс формы (в forms.py). Является ли это типичной настройкой, или она более распространена для проверки уровня модели на модели или в представлении?

Или есть лучший способ приблизиться к этому - например, используя ModelForm? Я новичок в Django и пытаюсь узнать, что является рекомендуемым шаблоном для этой ситуации.

Ответы

Ответ 1

Это очень интересный вопрос (для меня).

По-моему, весь код проверки должен быть перенесен в код модели. Это способ не нарушать бизнес-правила. Когда код проверки находится в модели, невозможно забыть некоторую проверку в новой форме или иметь противоречивые правила в нескольких формах.

Я ссылаюсь на ваш вопрос 'Django, Raise a validation error in model save method', который связан с вашим. Ниже вопроса вы можете увидеть , как переносить проверки кода из форм в модель. Я надеюсь, что это краткое введение поможет вам.

Откуда вы пришли? Как правила проверки записываются в вашем окружении?

Ответ 2

Я не согласен с принятым ответом. Я предпочитаю использовать проверку на уровне модели, чтобы избежать несогласованности в моделях и проверки на уровне форм для любых ограничений для конкретного сайта.

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

Таким образом, проверка модели должна проверять только те значения, которые явно ошибочны. но если вам когда-нибудь понадобится сделать что-то напуганное (символы Unicode в имени пользователя для бота, например), он должен позволить вам сделать это, даже если это только через админ или оболочку. Я прочитал ответ на StackOverflow, который всегда предлагал использовать бэкэнд-код, заполняя поля кодом типа form["field"] = "value", чтобы воспользоваться последовательной проверкой.