Процесс валидации формы в Django

категория: Django

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

После того как вызывается метод form.is_valid() происходят следующие вещи:

  1. Вызывается метод form.full_clean().
  2. Он выполняет итерацию по полям формы, и каждое поле валидируется.
  3. Данные приводятся к питоническому виду to_python() или рейзится ValidationError.
  4. Данные проверяются по правилам специфики филда, включая кастомные валидаторы или ValidationError.
  5. Если есть пользовательские clean_<field>() методы, то они вызваются.
  6. form.full_clean() выполняет метод form.clean(), в котором уже можно взаимодействовать с проверенными полями.
  7. Если это екземпляр ModelForm, то form._post_clean() выполняет следующее:
  • Передает данные ModelForm экземпляру модели, независимо от того, является ли form.is_valid() True или False.
  • Вызывает метод clean() модели.

Нужно еще не забыть, что сохранение экземпляра модели через ORM не вызывает метод clean() модели и что при сохранении модельной формы данные сначала сохраняются в экземпляр формы, а после - в экземпляр модели.

И ВСЕГДА все данные пользователя прогонять через форму перед записью в модель, даже если на фронте есть валидация!



blog comments powered by Disqus