Разделение ввода формы и проверки модели в Django?
Является ли типичным отделить проверку ввода от проверки уровня модели в проектах Django? Например, подтверждение того, что имя пользователя соответствует критериям именования, будет проверкой ввода, а проверка того, что пользователь еще не находится в базе данных, будет проверкой на уровне модели.
Я смотрю код со-работника, и они ставят оба типа проверки в класс формы (в forms.py). Является ли это типичной настройкой, или она более распространена для проверки уровня модели на модели или в представлении?
Или есть лучший способ приблизиться к этому - например, используя ModelForm
? Я новичок в Django и пытаюсь узнать, что является рекомендуемым шаблоном для этой ситуации.
Ответы
Ответ 1
Это очень интересный вопрос (для меня).
По-моему, весь код проверки должен быть перенесен в код модели. Это способ не нарушать бизнес-правила. Когда код проверки находится в модели, невозможно забыть некоторую проверку в новой форме или иметь противоречивые правила в нескольких формах.
Я ссылаюсь на ваш вопрос 'Django, Raise a validation error in model save method', который связан с вашим. Ниже вопроса вы можете увидеть , как переносить проверки кода из форм в модель. Я надеюсь, что это краткое введение поможет вам.
Откуда вы пришли? Как правила проверки записываются в вашем окружении?
Ответ 2
Я не согласен с принятым ответом. Я предпочитаю использовать проверку на уровне модели, чтобы избежать несогласованности в моделях и проверки на уровне форм для любых ограничений для конкретного сайта.
Предположим, что у нас есть модель для событий, с полями datetime
для времени начала и окончания. Проверка модели заставит нас иметь конечное время, которое приходит после времени начала. Однако я бы оставил его в форме, чтобы подтвердить, что недавно созданное событие не было в прошлом. Поэтому, если мне когда-либо приходилось добавлять событие, которое происходило в прошлом, я мог бы использовать специальную форму для администратора, которая позволяет использовать даты в прошлом, или просто добавить ее прямо в базу данных.
Таким образом, проверка модели должна проверять только те значения, которые явно ошибочны. но если вам когда-нибудь понадобится сделать что-то напуганное (символы Unicode в имени пользователя для бота, например), он должен позволить вам сделать это, даже если это только через админ или оболочку. Я прочитал ответ на StackOverflow, который всегда предлагал использовать бэкэнд-код, заполняя поля кодом типа form["field"] = "value"
, чтобы воспользоваться последовательной проверкой.