Форма и поля допускают установку ряда параметров, которые позволяют частично кастомизировать отображение полей и формы. Тем не менее этого нередко бывает недостаточно. Например, необходимо применить стилизацию или добавить рядом с полем ввода какой-нибудь специальный текст. И Django позволяет нам коренным образом изменить всю композицию создаваемых полей.
В частности, в шаблоне компонента мы можем обратиться к каждому отдельному полю формы через название формы: form.имя_поля. По названию поля мы можем получить непосредственно генерируемый им элемент-HTML без внешних надписей и какого-то дополнительного кода. Кроме того, каждое поле имеет ряд ассоциированных с ним значений:
form.имя_поля.name: возвращает имя поля
form.имя_поля.value: возвращает значение поля, которое ему было передано по умолчанию
form.имя_поля.label: возвращает текст метки, которая генерируется рядом с полем
form.имя_поля.id_for_label: возвращаетidдля поля, которое по умолчанию создается по схемеid_имя_поля.
form.имя_поля.auto_id: возвращаетidдля поля, которое по умолчанию создается по схемеid_имя_поля.
form.имя_поля.label_tag: возвращает элементlabel, который представляет метку рядом с полем
form.имя_поля.help_text: возвращает текст подсказки, ассоциированный с полем
form.имя_поля.errors: возвращает ошибки валидации, связанные с полем
form.имя_поля.css_classes: возвращает CSS-классы поля
form.имя_поля.as_hidden: генерирует для поля разметку в виде скрытого поля<input type="hidden">
form.имя_поля.is_hidden: возвращаетTrueилиFalseв зависимости от того, является ли поле скрытым
form.имя_поля.as_text: генерирует для поля разметку в виде текстового поля<input type="text">
form.имя_поля.as_textarea: генерирует для поля разметку в виде<textarea></textarea>
form.имя_поля.as_widget: возвращает виджет Django, ассоциированный с полем
Так, чтобы, например, получить текст метки поля, которое называется age, нам надо использовать выражение form.age.label.
Продолжим работать с нашей формой:
from django import forms
class UserForm(forms.Form):
name = forms.CharField(label='Имя', help_text='Введите свое имя', min_length=2, max_length=10)
age = forms.IntegerField(label='Ваш возраст?', help_text='Введите свой возраст')
reklama = forms.BooleanField(label='Coглacны получать рекламу?', required=False)
Немного изменим наше представление views.py:
from django.shortcuts import render
from django.http import HttpResponse
from .forms import UserForm
def index(request):
userform = UserForm()
if request.method == 'POST':
userform = UserForm(request.POST)
if userform.is_valid():
name = userform.cleaned_data['name']
return HttpResponse(f'<h2>Hello, {name}</h2>')
return render(request, 'index.html', {"form": userform})
И в шаблоне index.html пропишем использование полей формы:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Django Forms</title>
</head>
<body>
<form method="POST" novalidate>
{% csrf_token %}
<div>
{% for field in form %}
<div class="form-group">
{{ field.label_tag }}
<div>{{ field }}</div>
<div class="error">{{ field.errors }}</div>
</div>
{% endfor %}
</div>
<p><input type="submit" value="Send"></p>
</form>
</body>
</html>
Фактически форма представляет набор полей, и с помощью выражения {% for field in form %} мы пробегаемся по каждому полю на форме и можем управлять его отображением - отображением собственно поля и связанных с ним атрибутов - ошибок, текста подсказки, метки и т.д.
Если мы теперь при незаполненных полях нажмем кнопку Отправить, то возле каждого поля получим сообщение о наличии ошибки. Если мы оставим незаполненными только часть полей и нажмем кнопку Отправить, то сообщение о наличии ошибки будет показано только рядом с незаполненным полем.
Например, после отправки некорректных данных мы получим следующую веб-страницу:
Одно поле может содержать несколько ошибок. В этом случае можно использовать тег for для их последовательного вывода:
{% for error in field.errors %}
<div class="alert alert-danger">{{error}}</div>
{% endfor %}
В этом разделе были представлены сведения о формах. Мы узнали, как создать форму, как определить и настроить в форме поля, как проверить корректность введенных в форму данных. Теперь нам нужно разобраться с тем, как Django работает с самими данными. То есть понять, как можно сохранить в БД данные, которые пользователь ввел в форме, или как получить из БД данные, запрошенные пользователем через свой веб-браузер. Это мы сделаем в следующем разделе.