HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Создание сущности в CRUD требует наличия двух маршрутов: один для отображения формы, другой - для обработки формы. Также важно понимать, как взаимодействуют между собой эти маршруты, и как обрабатываются ошибки. Начнем с того, что у нас есть три состояния:</p>
1 <p>Создание сущности в CRUD требует наличия двух маршрутов: один для отображения формы, другой - для обработки формы. Также важно понимать, как взаимодействуют между собой эти маршруты, и как обрабатываются ошибки. Начнем с того, что у нас есть три состояния:</p>
2 <ul><li>Отображение новой формы</li>
2 <ul><li>Отображение новой формы</li>
3 <li>Отображение формы с подсвеченными ошибками валидации после ее отправки</li>
3 <li>Отображение формы с подсвеченными ошибками валидации после ее отправки</li>
4 <li>Редирект на страницу после успешной обработки формы. Обычно это редактирование сущности или списка сущностей</li>
4 <li>Редирект на страницу после успешной обработки формы. Обычно это редактирование сущности или списка сущностей</li>
5 </ul><p>Самое интересное здесь это когда пользователь нажал кнопку отправки, данные формы приходят в обработчик формы. Этот обработчик выполняет валидацию - проверку введенных данных. Например, проверяет, что данные в принципе есть - они не пустые. Если данные корректные, то обработка завершается, и пользователя отправляют в другое место. Если нет, то Django должен отработать эту ситуацию и сообщить пользователю о неверно введенных данных.</p>
5 </ul><p>Самое интересное здесь это когда пользователь нажал кнопку отправки, данные формы приходят в обработчик формы. Этот обработчик выполняет валидацию - проверку введенных данных. Например, проверяет, что данные в принципе есть - они не пустые. Если данные корректные, то обработка завершается, и пользователя отправляют в другое место. Если нет, то Django должен отработать эту ситуацию и сообщить пользователю о неверно введенных данных.</p>
6 <p>С точки зрения пользователя, сайт снова отображает форму с подставленными значениями, которые он ввел раньше. Кроме этого, на странице выводятся возникшие ошибки. Дальше пользователь их исправляет и отправляет форму заново. Этот процесс может повторяться много раз перед тем, как пользователь сделает все правильно.</p>
6 <p>С точки зрения пользователя, сайт снова отображает форму с подставленными значениями, которые он ввел раньше. Кроме этого, на странице выводятся возникшие ошибки. Дальше пользователь их исправляет и отправляет форму заново. Этот процесс может повторяться много раз перед тем, как пользователь сделает все правильно.</p>
7 <p>Технически Django ведет себя так:</p>
7 <p>Технически Django ведет себя так:</p>
8 <ol><li>Пользователь ввел что-то некорректно - происходит редирект на страницу с формой</li>
8 <ol><li>Пользователь ввел что-то некорректно - происходит редирект на страницу с формой</li>
9 <li>Django автоматически записывает данные формы в сессию, а затем использует эти данные для подстановки в форму. Тут участвует ModelForm</li>
9 <li>Django автоматически записывает данные формы в сессию, а затем использует эти данные для подстановки в форму. Тут участвует ModelForm</li>
10 </ol><p>Для реализации добавления новой сущности, нам нужно добавить четыре составляющие: описание формы, маршрут, обработчик маршрута, шаблон:</p>
10 </ol><p>Для реализации добавления новой сущности, нам нужно добавить четыре составляющие: описание формы, маршрут, обработчик маршрута, шаблон:</p>
11 <h3>Форма</h3>
11 <h3>Форма</h3>
12 <p>Форма описывает поля существующей модели Article. Поэтому для описания формы воспользуемся вспомогательным классом ModelForm, чтобы создать Form-класс из модели Django:</p>
12 <p>Форма описывает поля существующей модели Article. Поэтому для описания формы воспользуемся вспомогательным классом ModelForm, чтобы создать Form-класс из модели Django:</p>
13 <h3>Маршрут</h3>
13 <h3>Маршрут</h3>
14 <h3>Обработчик</h3>
14 <h3>Обработчик</h3>
15 <p>В данном get-обработчике мы создаем объект формы и передаем его в шаблон:</p>
15 <p>В данном get-обработчике мы создаем объект формы и передаем его в шаблон:</p>
16 <h3>Шаблон</h3>
16 <h3>Шаблон</h3>
17 <h2>Обработчик данных формы</h2>
17 <h2>Обработчик данных формы</h2>
18 <p>В данном обработчике нам понадобился доступ к объекту запроса. Любая информация о HTTP-запросе и любые данные, которые отправили по HTTP, можно получить только через request.</p>
18 <p>В данном обработчике нам понадобился доступ к объекту запроса. Любая информация о HTTP-запросе и любые данные, которые отправили по HTTP, можно получить только через request.</p>
19 <p>Первым делом объект request используется в валидации. Валидация в Django привязана к запросу. Она выполняется с помощью метода is_valid(), который доступен в каждом классе формы.</p>
19 <p>Первым делом объект request используется в валидации. Валидация в Django привязана к запросу. Она выполняется с помощью метода is_valid(), который доступен в каждом классе формы.</p>
20 <p>Метод is_valid() возвращает<em>true</em>, если данные формы в порядке, и<em>false</em>- в случае ошибок. Если найдены ошибки, то Django сохраняет данные формы и создает словарь ошибок, который можно получить через поле errors. Самый простой способ вывести ошибки, добавить над формой такой код:</p>
20 <p>Метод is_valid() возвращает<em>true</em>, если данные формы в порядке, и<em>false</em>- в случае ошибок. Если найдены ошибки, то Django сохраняет данные формы и создает словарь ошибок, который можно получить через поле errors. Самый простой способ вывести ошибки, добавить над формой такой код:</p>
21 <p>Вернемся к обработчику. Сразу после валидации данные формы сохраняются:</p>
21 <p>Вернемся к обработчику. Сразу после валидации данные формы сохраняются:</p>
22 <p>Когда объект сохранился в базе данных, осталось перенаправить пользователя в нужное место после успешного создания. Обычно отправка идет на список сущностей или страницу редактирования:</p>
22 <p>Когда объект сохранился в базе данных, осталось перенаправить пользователя в нужное место после успешного создания. Обычно отправка идет на список сущностей или страницу редактирования:</p>
23  
23