Django 5 для начинающих

Прогресс по курсу:  9/1004

4.1 Формы в Django
5 из 16 шагов пройдено
0 из 48 баллов  получено

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


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

В данном примере, если получить This field is required. для полей, потом ввести валидное значение и отправить его, потом вернуться назад, то ошибка This field is required. не пропадает. Это нормально или я где-то пропустил что-то?)

Изменен Василий Шопин

@Василий_Шопин, а после обновления страницы пропадает?

@Дмитрий_Селезнев, нет, ошибка остается.

@Василий_Шопин, это страница кэшируется браузером, отключить можно с помощью декоратора @never_cache:

from django.views.decorators.cache import never_cache

@never_cache
def index(request):

 После его добавления, при переходе на предыдущую страницу будет выведено сообщение, что документ просрочен.