Форма HTML- это группа из одного или нескольких полей (виджетов) на веб-странице, которая используется для получения информации от пользователей для последующей отправки на сервер и представляет собой таким образом гибкий механизм сбора пользовательских данных.
Формы несут целый набор виджетов для ввода различных типов данных: текстовые поля, флажки, переключатели, установщики дат и пр. Формы являются относительно безопасным способом взаимодействия пользовательского клиента и сервера, поскольку позволяют отправлять данные в РОSТ-запросах, применяя защиту от межсайтовой подделки запроса (Cross Site Request Forgery, CSRF).
Из материалов этого раздела вы узнаете:
- что такое формы Django и для чего они нужны;
- как применять в формах РОSТ-запросы;
- какие поля можно использовать в формах;
- как можно выполнить настройку формы и ее полей;
- как можно изменить внешний вид формы;
- как осуществляется проверка (валидация) данных в формах;
- как можно добавить стили к полям формы.
Создадим проект Course_ThirdProject и приложение с именем crud и рассмотрим работу с объектами модели данных при чтении, записи, редактировании и удалении записей. Не забываем добавлять наше приложение в settings.py и также добавить папку с шаблонами.
Определение форм
Если вы планируете создавать сайты и приложения, которые принимают и сохраняют данные от пользователей, вам необходимо использовать формы. Django предоставляет широкий набор инструментов для этого. Формы в HTML позволяют пользователю вводить текст, выбирать опции, изменять различные объекты, загружать рисунки на страницы и т. п., а потом отправлять эту информацию на сервер.
Django предоставляет различные возможности по работе с формами. Можно определить функциональность форм в одном месте и затем использовать их многократно в разных местах. При этом упрощается проверка корректности данных, связывание форм с моделями данных и многое другое.
Каждая форма определяется в виде отдельного класса, который расширяет класс forms.Form. Классы размещаются внутри проекта, где они используются. Нередко они помещаются в отдельный файл, который называется, к примеру, forms.py. Однако формы могут размещаться и внутри уже имеющихся в приложении файлов - например, в views.py или models.py.
Создадим в приложении crud новый файл forms.py и поместим в него следующий код:
from django import forms
class UserForm(forms.Form):
name = forms.CharField()
age = forms.IntegerField()
Здесь класс формы называется UserForm. В нем определены два поля:
- Поле
name(имя) имеет типforms.CharFieldи будет генерировать текстовое поле:input type="text".
- Поле
age(возраст) имеет типforms.IntegerFieldи будет генерировать числовое поле:input type="number".
То есть первое поле предназначено для ввода текста, а второе - для ввода чисел.
Далее в файле views.py мы можем определить следующий код для функции index():
from django.shortcuts import render
from .forms import UserForm
def index(request):
userform = UserForm()
return render(request, 'index.html', {'form': userform})
Здесь созданный нами объект формы передается в шаблон index.html в виде переменной form.
Теперь изменим шаблон index.html следующим образом:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Учу Django</title>
</head>
<body>
<table>
{{ form.as_table }}
</table>
</body>
</html>
Теперь осталось нам связать представление с маршрутами, для этого в главный urls.py проекта добавим следующий код:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('crud.urls')),
]
В этом коде мы импортируем маршруты из нашего приложения.
Теперь создадим файл маршрутов в папке приложения, для этого в папке crud создадим файл urls.py и добавим следующий код:
from django.urls import path
from crud import views
urlpatterns = [
path('', views.index),
]
Теперь запустим наш проект командой :
python manage.py runserver
А затем откроем наш сайт по адресу http://127.0.0.1:8000:
А в HTML коде страницы у нас будет следующий код:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Учу Django</title>
</head>
<body>
<table>
<tr>
<th><label for="id_name">Name:</label></th>
<td><input type="text" name="name" required id="id_name"></td>
</tr>
<tr>
<th><label for="id_age">Age:</label></th>
<td><input type="number" name="age" required id="id_age"></td>
</tr>
</table>
</body>
</html>
В обрамленные рамками поля пользователь может вводить свои данные. Следует заметить, что в модуле forms.py мы задали только идентификаторы полей name и age и не задавали метки полей (label), которые будут выводиться на экран. В Django эти метки генерируются автоматически. В частности, как можно видеть, для наших двух полей были сгенерированы метки: Name и Age.
По умолчанию в Django в качестве метки берется имя поля, и его первый символ меняется на заглавную букву. С одной стороны, такой прием избавляет программиста от дополнительного задания значения для метки поля, но это не всегда удобно.
Часто требуется задавать более осмысленные и достаточно длинные значения для меток полей и на языке, отличном от английского. Однако желательно избегать использования кириллицы и других символов, отличных от ASCII, в определении имен полей. Это впоследствии может привести к некорректному отображению информации, когда приложение будет развернуто на внешнем веб-ресурсе.
В Django имеется другая возможность задания метки для поля - с помощью параметра label.
Немного изменим содержимое файла forms.py и поместим в него следующий код:
from django import forms
class UserForm(forms.Form):
name = forms.CharField(label='Имя')
age = forms.IntegerField(label='Ваш возраст?')
Здесь мы задали имя поля латиницей, а метку поля определили кириллицей. В результате мы изменили названия наших полей инпут.
Кроме параметра label, поля форм Django, имеют еще ряд параметров, которые разработчик может определять программным способом. Их мы рассмотрим более подробно в следующих шагах.