Детальная настройка полей формы

Последнее обновление: 20.08.2022

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

Например, после отправки некорректных данных мы получим следующую веб-страницу:

Кастомизация и валидация форм в Django

Одно поле может содержать несколько ошибок. В этом случае можно использовать тег for для их последовательного вывода:

{% for error in field.errors %}
	<div class="alert alert-danger">{{error}}</div>
{% endfor %}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850