Python: Разработка на фреймворке Django
Теория: Создание (CRUD)
Создание сущности в CRUD требует наличия двух маршрутов: один для отображения формы, другой — для обработки формы. Также важно понимать, как взаимодействуют между собой эти маршруты, и как обрабатываются ошибки. Начнем с того, что у нас есть три состояния:
- Отображение новой формы
- Отображение формы с подсвеченными ошибками валидации после ее отправки
- Редирект на страницу после успешной обработки формы. Обычно это редактирование сущности или списка сущностей
Самое интересное здесь это когда пользователь нажал кнопку отправки, данные формы приходят в обработчик формы. Этот обработчик выполняет валидацию — проверку введенных данных. Например, проверяет, что данные в принципе есть — они не пустые. Если данные корректные, то обработка завершается, и пользователя отправляют в другое место. Если нет, то Django должен отработать эту ситуацию и сообщить пользователю о неверно введенных данных.
С точки зрения пользователя, сайт снова отображает форму с подставленными значениями, которые он ввел раньше. Кроме этого, на странице выводятся возникшие ошибки. Дальше пользователь их исправляет и отправляет форму заново. Этот процесс может повторяться много раз перед тем, как пользователь сделает все правильно.
Технически Django ведет себя так:
- Пользователь ввел что-то некорректно — происходит редирект на страницу с формой
- Django автоматически записывает данные формы в сессию, а затем использует эти данные для подстановки в форму. Тут участвует
ModelForm
Для реализации добавления новой сущности, нам нужно добавить четыре составляющие: описание формы, маршрут, обработчик маршрута, шаблон:
Форма
Форма описывает поля существующей модели Article. Поэтому для описания формы воспользуемся вспомогательным классом ModelForm, чтобы создать Form-класс из модели Django:
Маршрут
Обработчик
В данном get-обработчике мы создаем объект формы и передаем его в шаблон:
Шаблон
Обработчик данных формы
В данном обработчике нам понадобился доступ к объекту запроса. Любая информация о HTTP-запросе и любые данные, которые отправили по HTTP, можно получить только через request.
Первым делом объект request используется в валидации. Валидация в Django привязана к запросу. Она выполняется с помощью метода is_valid(), который доступен в каждом классе формы.
Метод is_valid() возвращает true, если данные формы в порядке, и false — в случае ошибок. Если найдены ошибки, то Django сохраняет данные формы и создает словарь ошибок, который можно получить через поле errors. Самый простой способ вывести ошибки, добавить над формой такой код:
Вернемся к обработчику. Сразу после валидации данные формы сохраняются:
Когда объект сохранился в базе данных, осталось перенаправить пользователя в нужное место после успешного создания. Обычно отправка идет на список сущностей или страницу редактирования:


