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