1 added
1 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Для создания и обновление сущности в CRUD, нужно принять данные от пользователя. Для этого существуют формы - элемент взаимодействия между пользователем и веб-приложением. Основная цель форм это собирать данные от пользователей структурированным и безопасным способом. Когда вы регистрируетесь на сайте, оставляете комментарий, делаете заказ в интернет-магазине - все эти данные проходят через формы.</p>
1
<p>Для создания и обновление сущности в CRUD, нужно принять данные от пользователя. Для этого существуют формы - элемент взаимодействия между пользователем и веб-приложением. Основная цель форм это собирать данные от пользователей структурированным и безопасным способом. Когда вы регистрируетесь на сайте, оставляете комментарий, делаете заказ в интернет-магазине - все эти данные проходят через формы.</p>
2
<p>Но создавать формы вручную утомительно. Сотни строк одинакового кода, обработка ошибок, защита от атак - всё это придется делать постоянно.</p>
2
<p>Но создавать формы вручную утомительно. Сотни строк одинакового кода, обработка ошибок, защита от атак - всё это придется делать постоянно.</p>
3
<p>Обычно у фреймворков есть встроенная поддержка генерации форм. Она состоит из набора функций, которые автоматизируют рутину. Django не является исключением. Он предоставляет ряд инструментов и библиотек, которые помогут создавать формы для отправки пользователем информации, а затем обрабатывать и отвечать на нее. В этом уроке разберем, как генерировать формы.</p>
3
<p>Обычно у фреймворков есть встроенная поддержка генерации форм. Она состоит из набора функций, которые автоматизируют рутину. Django не является исключением. Он предоставляет ряд инструментов и библиотек, которые помогут создавать формы для отправки пользователем информации, а затем обрабатывать и отвечать на нее. В этом уроке разберем, как генерировать формы.</p>
4
<h2>Django Forms</h2>
4
<h2>Django Forms</h2>
5
<p>В Django формы выполняют несколько важных функций:</p>
5
<p>В Django формы выполняют несколько важных функций:</p>
6
<ul><li>Генерация HTML-разметки - Django может автоматически создавать HTML-код для форм.</li>
6
<ul><li>Генерация HTML-разметки - Django может автоматически создавать HTML-код для форм.</li>
7
<li>Валидация данных - формы проверяют корректность введенных данных. Например, является ли email действительным адресом электронной почты, достаточно ли длинный пароль, заполнены ли обязательные поля.</li>
7
<li>Валидация данных - формы проверяют корректность введенных данных. Например, является ли email действительным адресом электронной почты, достаточно ли длинный пароль, заполнены ли обязательные поля.</li>
8
<li>Безопасность - Django-формы защищают от распространенных атак и помогают предотвратить внедрение вредоносного кода.</li>
8
<li>Безопасность - Django-формы защищают от распространенных атак и помогают предотвратить внедрение вредоносного кода.</li>
9
</ul><p>В Django существует два способа создания форм: создать форму с нуля или использовать ModelForm, форму на базе существующей модели.</p>
9
</ul><p>В Django существует два способа создания форм: создать форму с нуля или использовать ModelForm, форму на базе существующей модели.</p>
10
<p>Сперва рассмотрим первый. Представим, что мы хотим добавить возможность оставлять комментарии к статьям на нашем блоге. Для ввода комментария нам понадобится форма.</p>
10
<p>Сперва рассмотрим первый. Представим, что мы хотим добавить возможность оставлять комментарии к статьям на нашем блоге. Для ввода комментария нам понадобится форма.</p>
11
<p>Создадим файл forms.py внутри приложения. В этом файле, подобно аналогичным файлам с сущностями<em>models.py</em>или<em>views.py</em>, мы будем писать все формы нашего приложения:</p>
11
<p>Создадим файл forms.py внутри приложения. В этом файле, подобно аналогичным файлам с сущностями<em>models.py</em>или<em>views.py</em>, мы будем писать все формы нашего приложения:</p>
12
<p>Теперь добавим следующий код:</p>
12
<p>Теперь добавим следующий код:</p>
13
<p>В коде выше мы определили класс нашей формы, используя базовый Django класс Form, подобно тому как мы это делали с вью. В классе мы указали поле content типа CharField, встроенного типа для текстовых данных. Также мы добавили для поля человекочитаемый лейбл label=Комментарий и ограничение на максимальную длин поля.</p>
13
<p>В коде выше мы определили класс нашей формы, используя базовый Django класс Form, подобно тому как мы это делали с вью. В классе мы указали поле content типа CharField, встроенного типа для текстовых данных. Также мы добавили для поля человекочитаемый лейбл label=Комментарий и ограничение на максимальную длин поля.</p>
14
<p>Когда Django отрендерит форму, то она превратится в следующий HTML:</p>
14
<p>Когда Django отрендерит форму, то она превратится в следующий HTML:</p>
15
<p>Заметьте, что HTML не включает тег <form> или кнопку отправки. Нам нужно самим добавить их в шаблон.</p>
15
<p>Заметьте, что HTML не включает тег <form> или кнопку отправки. Нам нужно самим добавить их в шаблон.</p>
16
<p>Теперь создадим вью с использованием формы:</p>
16
<p>Теперь создадим вью с использованием формы:</p>
17
<p>Порядок работы с формами следующий - если пользователь запрашивает вью методом GET, то создаем пустую форму и отправляем ее в шаблоне. Если пользователь отправляет данные через POST, то получаем данные из формы, проверяем их корректность методом .is_valid() и затем используем эти данные для создания нового комментария.</p>
17
<p>Порядок работы с формами следующий - если пользователь запрашивает вью методом GET, то создаем пустую форму и отправляем ее в шаблоне. Если пользователь отправляет данные через POST, то получаем данные из формы, проверяем их корректность методом .is_valid() и затем используем эти данные для создания нового комментария.</p>
18
<p>Наконец, создадим шаблон с нашей формой:</p>
18
<p>Наконец, создадим шаблон с нашей формой:</p>
19
<p>В шаблоне для отображения формы достаточно указать только переменную {{ form }}. Django подставит вместо нее используемую форму. Мы также обязательно добавляем {% csrf_token %} в форму. Данная инструкция встраивает скрытое поле со случайным кодом, который проверяется Django и защищает от<a>CSRF-атак</a>.</p>
19
<p>В шаблоне для отображения формы достаточно указать только переменную {{ form }}. Django подставит вместо нее используемую форму. Мы также обязательно добавляем {% csrf_token %} в форму. Данная инструкция встраивает скрытое поле со случайным кодом, который проверяется Django и защищает от<a>CSRF-атак</a>.</p>
20
<h2>Django ModelForm</h2>
20
<h2>Django ModelForm</h2>
21
<p>Второй подход в создании форм - создание на основе существующей модели. Для этого в Django есть вспомогательный класс, который позволяет создавать Form-класс из модели Django:</p>
21
<p>Второй подход в создании форм - создание на основе существующей модели. Для этого в Django есть вспомогательный класс, который позволяет создавать Form-класс из модели Django:</p>
22
<p>Такой класс при генерации будет иметь все перечисленные поля в атрибуте fields указанной модели в атрибуте model.</p>
22
<p>Такой класс при генерации будет иметь все перечисленные поля в атрибуте fields указанной модели в атрибуте model.</p>
23
<p>Обработка ModelForm отличается от Forms только тем, что в ModelForm у нас уже есть связь с моделью. Поэтому мы можем после проверки формы сразу перейти к сохранению данных:</p>
23
<p>Обработка ModelForm отличается от Forms только тем, что в ModelForm у нас уже есть связь с моделью. Поэтому мы можем после проверки формы сразу перейти к сохранению данных:</p>
24
<p>Если нам нужно дополнительно заполнить или обработать поля формы, то мы можем указать Django, что данные не нужно сразу сохранять:</p>
24
<p>Если нам нужно дополнительно заполнить или обработать поля формы, то мы можем указать Django, что данные не нужно сразу сохранять:</p>
25
<p>В данном примере мы при помощи commit=False говорим Django, что данные пока сохранять не нужно, и получаем объект нашей модели. После дополнительной обработки модели ее необходимо сохранить с помощью вызова метода .save().</p>
25
<p>В данном примере мы при помощи commit=False говорим Django, что данные пока сохранять не нужно, и получаем объект нашей модели. После дополнительной обработки модели ее необходимо сохранить с помощью вызова метода .save().</p>
26
<h3>Валидация форм</h3>
26
<h3>Валидация форм</h3>
27
<p>Одно из правил веба - не доверять вводимым данным от пользователей. В этом нам помогают формы как промежуточный слой в приложении между вью (клиентской частью) и моделью (серверной частью). Слой форм позволяет проверять, валидировать, данные пользователей, защищая данные нашего приложения и их цельность.</p>
27
<p>Одно из правил веба - не доверять вводимым данным от пользователей. В этом нам помогают формы как промежуточный слой в приложении между вью (клиентской частью) и моделью (серверной частью). Слой форм позволяет проверять, валидировать, данные пользователей, защищая данные нашего приложения и их цельность.</p>
28
<p>В Django для валидации используется метод .is_valid(), который запускает многоэтапный метод проверки формы:</p>
28
<p>В Django для валидации используется метод .is_valid(), который запускает многоэтапный метод проверки формы:</p>
29
<ul><li>Базовая валидация</li>
29
<ul><li>Базовая валидация</li>
30
-
</ul><p>У каждого тип поля формы (CharField, EmailField, IntegerField и т.д.) есть свои встроенные правила валидации:</p>
30
+
</ul><p>У каждого тип поля формы (CharField, EmailField, IntegerField и т.д.) ес��ь свои встроенные правила валидации:</p>
31
<ul><li>Проверка обязательных полей</li>
31
<ul><li>Проверка обязательных полей</li>
32
</ul><p>Django проверяет, заполнены ли все обязательные поля:</p>
32
</ul><p>Django проверяет, заполнены ли все обязательные поля:</p>
33
<ul><li>Пользовательская валидация на уровне поля</li>
33
<ul><li>Пользовательская валидация на уровне поля</li>
34
</ul><p>Мы можем добавить свои правила валидации для отдельных полей через метод clean_fieldname:</p>
34
</ul><p>Мы можем добавить свои правила валидации для отдельных полей через метод clean_fieldname:</p>
35
<ul><li>Валидация на уровне формы</li>
35
<ul><li>Валидация на уровне формы</li>
36
</ul><p>Метод clean() может валидировать несколько полей сразу, это позволяет проверять взаимозависимости между полями. Например, частая ситуация проверки подтверждения пароля:</p>
36
</ul><p>Метод clean() может валидировать несколько полей сразу, это позволяет проверять взаимозависимости между полями. Например, частая ситуация проверки подтверждения пароля:</p>
37
<ul><li>Валидация ModelForm</li>
37
<ul><li>Валидация ModelForm</li>
38
</ul><p>В случае ModelForm Django валидирует по ограничениям полям модели:</p>
38
</ul><p>В случае ModelForm Django валидирует по ограничениям полям модели:</p>
39
<p>Когда вызывается метод is_valid(), то выполнятся по порядку все проверки выше. После валидации мы уже можем получить очищенные данные так и словарь всех ошибок:</p>
39
<p>Когда вызывается метод is_valid(), то выполнятся по порядку все проверки выше. После валидации мы уже можем получить очищенные данные так и словарь всех ошибок:</p>
40
40