Форма и поля допускают установку ряда параметров, которые позволяют частично кастомизировать отображение полей и формы. Тем не менее этого нередко бывает недостаточно. Например, необходимо применить стилизацию или добавить рядом с полем ввода какой-нибудь специальный текст. И 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()
age = forms.IntegerField()
В представлении передадим эту форму в шаблон:
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 %}