Spec-Zone.ru › Django 5.0

Работа с формами

О документе

Этот документ предоставляет введение в основы веб-форм и как они обрабатываются в Django. Для более подробного ознакомления со специфическими областями API форм, см. API форм, Поля форм и Валидация форм и полей.

Если вы не планируете создавать веб-сайты и приложения, которые только публикуют контент и не принимают ввод от посетителей, вам необходимо понимать и использовать формы.

Django предоставляет ряд инструментов и библиотек, чтобы помочь вам создавать формы для приема ввода от посетителей сайта, а затем обрабатывать и реагировать на этот ввод.

HTML-формы

В HTML форма — это набор элементов внутри <form>...</form>, которые позволяют посетителю выполнять такие действия, как ввод текста, выбор опций, изменение объектов или элементов управления и т. д., а затем отправлять эту информацию обратно на сервер.

Некоторые из этих элементов интерфейса формы — текстовые поля или флажки — встроены в сам HTML. Другие намного сложнее; интерфейс, который открывает календарь выбора даты, позволяет перемещать ползунок или изменять элементы управления, обычно использует JavaScript и CSS, а также HTML-элементы форм <input> для достижения этих эффектов.

Помимо своих <input> элементов, форма должна указывать два параметра:

  • где: URL, на который должны быть возвращены данные, соответствующие вводу пользователя
  • как: HTTP-метод, с помощью которого данные должны быть возвращены

Например, форма входа в администрирование Django содержит несколько <input> элементов: одно type="text" для имени пользователя, одно type="password" для пароля и одно type="submit" для кнопки «Войти». Она также содержит некоторые скрытые текстовые поля, которые пользователь не видит, которые Django использует для определения дальнейших действий.

Она также сообщает браузеру, что данные формы должны быть отправлены на URL, указанный в <form> атрибуте action — /admin/ — и что они должны быть отправлены с использованием HTTP-механизма, указанного в атрибуте method — post.

Когда элемент <input type="submit" value="Log in"> активируется, данные возвращаются в /admin/.

GET и POST

GET и POST являются единственными HTTP-методами, используемыми при работе с формами.

Форма входа в Django возвращается с использованием метода POST, в котором браузер собирает данные формы, кодирует их для передачи, отправляет их на сервер и получает ответ.

GET, в отличие от этого, упаковывает отправленные данные в строку и использует её для составления URL. URL содержит адрес, куда должны быть отправлены данные, а также ключи и значения данных. Вы можете увидеть это в действии, если выполните поиск в документации Django, что приведет к URL-адресу в формате https://docs.djangoproject.com/search/?q=forms&release=1.

GET и POST обычно используются для разных целей.

Любой запрос, который может изменить состояние системы (например, запрос, который вносит изменения в базу данных), должен использовать POST. GET следует использовать только для запросов, которые не влияют на состояние системы.

GET также не подходит для формы пароля, поскольку пароль будет отображаться в URL, а также в истории браузера и журнале сервера, в открытом виде. Он также не подходит для больших объемов данных или для бинарных данных, таких как изображение. Веб-приложение, которое использует запросы GET для административных форм, представляет собой риск для безопасности: злоумышленнику легко имитировать запрос формы для доступа к чувствительным частям системы. POST, в сочетании с другими средствами защиты, такими как защита CSRF Django, обеспечивает больший контроль над доступом.

С другой стороны, GET подходит для таких вещей, как форма поиска в веб, потому что URL-адреса, представляющие запрос GET , легко закладки, можно поделиться ими или повторить запрос.

Роль Django в обработке форм

Обработка форм — это сложная задача. Рассмотрим административную панель Django, где много данных различных типов может потребоваться подготовить для отображения в форме, преобразовать в HTML, отредактировать удобным интерфейсом, вернуть на сервер, валидировать и очистить, а затем сохранить или передать на дальнейшую обработку.

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

Django обрабатывает три отдельных части работы, связанной с формами:

  • подготовка и перестройка данных для их подготовки к рендерингу
  • создание HTML-форм для данных
  • прием и обработка отправленных форм и данных от клиента

Возможно написать код, который сделает всё это вручную, но Django может позаботиться обо всём за вас.

Формы в Django

Мы кратко описали HTML-формы, но HTML-<form> — это только одна часть механизма, необходимая для работы.

В контексте веб-приложения «форма» может относиться к этому HTML-элементу <form>, к классу Django Form, который его генерирует, к структурированным данным, возвращаемым при отправке, или к законченному комплексу этих компонентов.

Класс Django Form

В основе этой системы компонентов лежит класс Django Form. Точно так же, как модель Django описывает логическую структуру объекта, его поведение и способ представления его частей, класс Form описывает форму и определяет, как она работает и выглядит.

Так же, как поля класса модели сопоставляются с полями базы данных, поля класса формы сопоставляются с элементами HTML-формы <input>. (Класс ModelForm сопоставляет поля класса модели с элементами HTML-формы <input> через класс Form; на этом основана административная панель Django.)

Поля формы сами являются классами; они управляют данными формы и выполняют валидацию при отправке формы. Класс DateField и класс FileField обрабатывают совершенно разные типы данных и выполняют с ними разные действия.

Поле формы представлено пользователю в браузере как HTML-«виджет» — часть механизма пользовательского интерфейса. Для каждого типа поля существует соответствующий виджет по умолчанию класс виджета, но их можно переопределить по мере необходимости.

Создание, обработка и отображение форм

При отображении объекта в Django мы обычно:

  1. получаем его в представлении (например, извлекаем из базы данных)
  2. передаем его в контекст шаблона
  3. преобразуем его в HTML-разметку с помощью переменных шаблона

Отображение формы в шаблоне включает почти ту же работу, что и отображение любого другого типа объекта, но есть некоторые ключевые различия.

В случае экземпляра модели, не содержащего данных, редко бывает полезно что-то делать с ним в шаблоне. С другой стороны, имеет смысл отобразить пустую форму — именно это мы делаем, когда хотим, чтобы пользователь заполнил её.

Таким образом, при работе с экземпляром модели в представлении мы обычно извлекаем его из базы данных. Когда мы работаем с формой, мы обычно создаём её экземпляр в представлении.

При создании экземпляра формы мы можем выбрать оставить её пустой или заполнить, например, данными из сохранённого экземпляра модели (как в случае с формами редактирования в администрировании), данными, собранными из других источников, или данными, полученными из предыдущей отправки HTML-формы.

Последний из этих случаев наиболее интересен, поскольку он позволяет пользователям не только просматривать веб-сайт, но и отправлять информацию обратно на него.

Создание формы

Необходимая работа

Предположим, вы хотите создать простую форму на своём веб-сайте, чтобы получить имя пользователя. Вам понадобится что-то вроде этого в вашем шаблоне:

<form action="/your-name/" method="post">
    <label for="your_name">Your name: </label>
    <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
    <input type="submit" value="OK">
</form>

Это сообщает браузеру вернуть данные формы на URL /your-name/, используя метод POST. Он отобразит текстовое поле с меткой «Ваше имя:» и кнопку «ОК». Если в контексте шаблона есть переменная current_name, она будет использована для предварительного заполнения поля your_name.

Вам потребуется представление, которое отображает шаблон, содержащий HTML-форму, и которое может предоставить поле current_name как нужно.

Когда форма отправляется, запрос POST , который отправляется на сервер, будет содержать данные формы.

Теперь вам также понадобится представление, соответствующее URL /your-name/ , которое найдёт соответствующие пары «ключ-значение» в запросе и обработает их.

Это очень простая форма. На практике форма может содержать десятки или сотни полей, многие из которых могут потребоваться заполнить, и мы можем ожидать, что пользователь несколько раз пройдёт цикл редактирования-отправки, прежде чем завершит операцию.

Нам может потребоваться выполнить некоторую валидацию в браузере, даже прежде чем форма будет отправлена; мы можем захотеть использовать гораздо более сложные поля, позволяющие пользователю выбирать даты из календаря и т. д.

На этом этапе гораздо проще заставить Django выполнить большую часть этой работы за нас.

Создание формы в Django

Класс Form

Мы уже знаем, как должен выглядеть наш HTML-формуляр. Наш отправной пункт для него в Django — это:

forms.py
from django import forms


class NameForm(forms.Form):
    your_name = forms.CharField(label="Your name", max_length=100)

Это определяет класс Form с одним полем (your_name). Мы применили удобочитаемое имя поля, которое будет отображаться в <label> при его рендеринге (хотя в этом случае, указанное нами label фактически является тем же именем, которое было бы сгенерировано автоматически, если бы мы его опустили).

Максимальная допустимая длина поля определяется max_length. Это делает два дела. Оно устанавливает maxlength="100" на HTML <input> (так что браузер должен предотвратить ввод пользователем большего числа символов в первую очередь). Это также означает, что когда Django получит форму обратно от браузера, он проверит длину данных.

Экземпляр Form имеет метод is_valid(), который выполняет процедуры проверки для всех его полей. Когда этот метод вызывается, если все поля содержат допустимые данные, он:

  • вернёт True
  • поместит данные формы в его атрибут cleaned_data.

Вся форма при первом отображении будет выглядеть как:

<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100" required>

Обратите внимание, что она не включает <form> теги или кнопку отправки. Нам нужно будет предоставить их самим в шаблоне.

Обработка формы

Данные формы, отправленные на веб-сайт Django, обрабатываются представлением, как правило, тем же представлением, которое опубликовало форму. Это позволяет нам повторно использовать часть той же логики.

Для обработки формы нам нужно создать её экземпляр в представлении для URL, где мы хотим её опубликовать:

views.py
from django.http import HttpResponseRedirect
from django.shortcuts import render

from .forms import NameForm


def get_name(request):
    # if this is a POST request we need to process the form data
    if request.method == "POST":
        # create a form instance and populate it with data from the request:
        form = NameForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            return HttpResponseRedirect("/thanks/")

    # if a GET (or any other method) we'll create a blank form
    else:
        form = NameForm()

    return render(request, "name.html", {"form": form})

Если мы попадаем в это представление с GET запросом, оно создаст пустой экземпляр формы и поместит его в контекст шаблона для рендеринга. Это то, что мы можем ожидать при первом посещении URL.

Если форма отправляется с использованием POST запроса, представление снова создаст экземпляр формы и заполнит его данными из запроса: form = NameForm(request.POST) Это называется «привязкой данных к форме» (теперь это связанная форма).

Мы вызываем метод is_valid() формы; если он не True, мы возвращаемся в шаблон с формой. На этот раз форма больше не пустая (несвязанная), поэтому HTML-формуляр будет заполнен ранее отправленными данными, где их можно будет отредактировать и исправить по мере необходимости.

Если is_valid() является True, мы теперь сможем найти все валидированные данные формы в его атрибуте cleaned_data. Мы можем использовать эти данные для обновления базы данных или выполнения других операций перед отправкой HTTP-редиректа браузеру, сообщая ему, куда перейти дальше.

Шаблон

В нашем name.html шаблоне нам не нужно делать много:

<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

Все поля формы и их атрибуты будут распакованы в HTML-разметку из {{ form }} языком шаблонов Django.

Формы и защита от межсайтовых поддельных запросов

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

HTML5 типы ввода и валидация браузера

Если ваша форма содержит URLField, EmailField или любой целочисленный тип поля, Django будет использовать HTML5 типы ввода url, email и number. По умолчанию браузеры могут применять собственную валидацию к этим полям, которая может быть строже, чем валидация Django. Если вы хотите отключить это поведение, задайте атрибут novalidate тега form, или укажите другой виджет на поле, как TextInput.

Теперь у нас есть рабочая веб-форма, описанная Django Form, обработанная представлением и отображённая как HTML <form>.

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

Подробнее о классах форм Django

Все классы форм создаются как подклассы либо django.forms.Form, либо django.forms.ModelForm. Можно представить себе ModelForm как подкласс Form. Form и ModelForm фактически наследуют общие функции от (частного) BaseForm класса, но эта деталь реализации редко важна.

Модели и формы

Фактически, если ваша форма будет использоваться для непосредственного добавления или редактирования Django-модели, ModelForm сэкономит вам много времени, усилий и кода, так как он сгенерирует форму вместе с соответствующими полями и их атрибутами из класса Model.

Связанные и несвязанные экземпляры формы

Различие между связанными и несвязанными формами важно:

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

Атрибут формы is_bound сообщит вам, связаны ли данные с формой или нет.

Подробнее о полях

Рассмотрим более полезную форму, чем наш минимальный пример выше, которую мы могли бы использовать для реализации функции «свяжитесь со мной» на личном веб-сайте:

forms.py
from django import forms


class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea)
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)

Наша предыдущая форма использовала одно поле, your_name, CharField. В данном случае наша форма имеет четыре поля: subject, message, sender и cc_myself. CharField, EmailField и BooleanField — всего лишь три из доступных типов полей; полный список можно найти в Поля форм.

Виджеты

Каждое поле формы имеет соответствующий Класс виджета, который, в свою очередь, соответствует HTML-виджету формы, например, <input type="text">.

В большинстве случаев поле имеет разумный виджет по умолчанию. Например, по умолчанию CharField будет иметь виджет TextInput, который создаёт элемент <input type="text"> в HTML. Если вам нужен <textarea> вместо этого, вы указали бы соответствующий виджет при определении вашего поля формы, как мы сделали для поля message.

Данные поля

Какие бы данные ни были отправлены с формой, после успешной валидации с вызовом is_valid() (и is_valid() возвращает True) валидированные данные формы будут в словаре form.cleaned_data. Эти данные будут красиво преобразованы в типы Python.

Примечание

Вы по-прежнему можете получить доступ к невалидированным данным непосредственно из request.POST на этом этапе, но валидированные данные лучше.

В примере формы связи выше, cc_myself будет булевым значением. Аналогично, поля, такие как IntegerField и FloatField преобразуют значения в Python int и float соответственно.

Вот как данные формы могут быть обработаны в представлении, обрабатывающем эту форму:

views.py
from django.core.mail import send_mail

if form.is_valid():
    subject = form.cleaned_data["subject"]
    message = form.cleaned_data["message"]
    sender = form.cleaned_data["sender"]
    cc_myself = form.cleaned_data["cc_myself"]

    recipients = ["info@example.com"]
    if cc_myself:
        recipients.append(sender)

    send_mail(subject, message, sender, recipients)
    return HttpResponseRedirect("/thanks/")

Подсказка

Для получения дополнительной информации об отправке электронной почты из Django, см. Отправка электронной почты.

Некоторые типы полей требуют дополнительной обработки. Например, файлы, загружаемые с помощью формы, должны обрабатываться по-другому (их можно получить из request.FILES, а не из request.POST). Подробности о том, как обрабатывать загрузки файлов с помощью формы, см. в Связывание загруженных файлов с формой.

Работа с шаблонами форм

Для отображения вашей формы в шаблоне достаточно поместить экземпляр формы в контекст шаблона. Таким образом, если ваша форма называется form в контексте, {{ form }} будет правильно отображать её элементы <label> и <input>.

Дополнительные элементы шаблона формы

Не забудьте, что вывод формы не включает окружающие <form> теги или submit элемент управления формы. Вам нужно будет предоставить их самостоятельно.

Многократно используемые шаблоны форм

HTML-вывод при отображении формы генерируется через шаблон. Вы можете контролировать это, создав соответствующий файл шаблона и установив пользовательский FORM_RENDERER для использования этого form_template_name на всём сайте. Вы также можете настроить по форме, переопределив атрибут формы template_name для отображения формы с помощью пользовательского шаблона или передав имя шаблона напрямую в Form.render().

В приведённом ниже примере {{ form }} будет отображаться как результат работы шаблона form_snippet.html.

В ваших шаблонах:

# In your template:
{{ form }}

# In form_snippet.html:
{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
{% endfor %}

Затем вы можете настроить настройку FORM_RENDERER:

settings.py
from django.forms.renderers import TemplatesSetting


class CustomFormRenderer(TemplatesSetting):
    form_template_name = "form_snippet.html"


FORM_RENDERER = "project.settings.CustomFormRenderer"

… или для отдельной формы:

class MyForm(forms.Form):
    template_name = "form_snippet.html"
    ...

… или для отдельного отображения экземпляра формы, передав имя шаблона в Form.render(). Вот пример использования в представлении:

def index(request):
    form = MyForm()
    rendered_form = form.render("form_snippet.html")
    context = {"form": rendered_form}
    return render(request, "index.html", context)

См. Вывод форм в формате HTML для получения более подробной информации.

Многократно используемые шаблоны группы полей

Новое в Django 5.0.

Каждое поле доступно в качестве атрибута формы, используя {{ form.name_of_field }} в шаблоне. Поле имеет метод as_field_group(), который отображает связанные элементы поля как группу: его метку, виджет, ошибки и текст подсказки.

Это позволяет создавать универсальные шаблоны, которые организуют элементы полей в требуемой структуре. Например:

{{ form.non_field_errors }}
<div class="fieldWrapper">
  {{ form.subject.as_field_group }}
</div>
<div class="fieldWrapper">
  {{ form.message.as_field_group }}
</div>
<div class="fieldWrapper">
  {{ form.sender.as_field_group }}
</div>
<div class="fieldWrapper">
  {{ form.cc_myself.as_field_group }}
</div>

По умолчанию Django использует шаблон "django/forms/field.html" , разработанный для использования с форматом формы "django/forms/div.html" по умолчанию.

Шаблон по умолчанию можно настроить, установив field_template_name в файле настроек вашего проекта FORM_RENDERER:

from django.forms.renderers import TemplatesSetting


class CustomFormRenderer(TemplatesSetting):
    field_template_name = "field_snippet.html"

… или для одного поля:

class MyForm(forms.Form):
    subject = forms.CharField(template_name="my_custom_template.html")
    ...

… или на основе каждого запроса, вызвав BoundField.render() и передав имя шаблона:

def index(request):
    form = ContactForm()
    subject = form["subject"]
    context = {"subject": subject.render("my_custom_template.html")}
    return render(request, "index.html", context)

Ручное отображение полей

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

{{ form.non_field_errors }}
<div class="fieldWrapper">
    {{ form.subject.errors }}
    <label for="{{ form.subject.id_for_label }}">Email subject:</label>
    {{ form.subject }}
</div>
<div class="fieldWrapper">
    {{ form.message.errors }}
    <label for="{{ form.message.id_for_label }}">Your message:</label>
    {{ form.message }}
</div>
<div class="fieldWrapper">
    {{ form.sender.errors }}
    <label for="{{ form.sender.id_for_label }}">Your email address:</label>
    {{ form.sender }}
</div>
<div class="fieldWrapper">
    {{ form.cc_myself.errors }}
    <label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label>
    {{ form.cc_myself }}
</div>

Полные <label> элементы также можно генерировать с помощью label_tag(). Например:

<div class="fieldWrapper">
    {{ form.subject.errors }}
    {{ form.subject.label_tag }}
    {{ form.subject }}
</div>

Отображение сообщений об ошибках формы

Цена этой гибкости — немного больше работы. До сих пор нам не приходилось беспокоиться о том, как отображать ошибки формы, поскольку это было за нас. В этом примере нам нужно убедиться, что мы обрабатываем любые ошибки для каждого поля и любые ошибки для всей формы в целом. Обратите внимание на {{ form.non_field_errors }} вверху формы и поиск шаблона для ошибок каждого поля.

Использование {{ form.name_of_field.errors }} отображает список ошибок формы, рендерящихся как список без маркировки. Это может выглядеть так:

<ul class="errorlist">
    <li>Sender is required.</li>
</ul>

Список имеет CSS-класс errorlist, чтобы вы могли стилизовать его внешний вид. Если вы хотите дополнительно настроить отображение ошибок, вы можете это сделать, перебирая их:

{% if form.subject.errors %}
    <ol>
    {% for error in form.subject.errors %}
        <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
    </ol>
{% endif %}

Ошибки, не относящиеся к полям (и/или ошибки скрытых полей, которые отображаются в верхней части формы при использовании помощников, таких как form.as_p()), будут отображаться с дополнительным классом nonfield, чтобы помочь отличить их от ошибок, относящихся к конкретным полям. Например, {{ form.non_field_errors }} будет выглядеть так:

<ul class="errorlist nonfield">
    <li>Generic validation error</li>
</ul>

См. API форм для получения дополнительной информации об ошибках, стилях и работе с атрибутами форм в шаблонах.

Перебор полей формы

Если вы используете один и тот же HTML для каждого поля формы, вы можете сократить дублирование кода, перебирая каждое поле по очереди, используя цикл {% for %}:

{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
        {% if field.help_text %}
          <p class="help" id="{{ field.auto_id }}_helptext">
            {{ field.help_text|safe }}
          </p>
        {% endif %}
    </div>
{% endfor %}

Полезные атрибуты {{ field }} включают:

{{ field.errors }}
Выводит <ul class="errorlist">, содержащий любые ошибки проверки, соответствующие этому полю. Вы можете настроить отображение ошибок с помощью цикла {% for error in field.errors %}. В этом случае каждый объект в цикле — это строка, содержащая сообщение об ошибке.
{{ field.field }}
Экземпляр Field из класса формы, который оборачивает этот BoundField. Вы можете использовать его для доступа к атрибутам Field, например, {{ char_field.field.max_length }}.
{{ field.help_text }}
Любой текст подсказки, связанный с полем.
{{ field.html_name }}
Имя поля, которое будет использоваться в поле name элемента input. Это учитывает префикс формы, если он установлен.
{{ field.id_for_label }}
ID, который будет использован для этого поля (id_email в приведённом выше примере). Если вы создаёте метку вручную, вы можете использовать это вместо label_tag. Это также полезно, например, если у вас есть какой-то встроенный JavaScript и вы хотите избежать жёсткой кодировки ID поля.
{{ field.is_hidden }}
Этот атрибут равен True , если поле формы — это скрытое поле, и False в противном случае. Он не особенно полезен как переменная шаблона, но может быть полезен в условных проверках, таких как:
{% if field.is_hidden %}
   {# Do something special #}
{% endif %}
{{ field.label }}
Метка поля, например Email address.
{{ field.label_tag }}

Метка поля, заключённая в соответствующий HTML <label> тег. Это включает label_suffix формы. Например, значение по умолчанию для label_suffix — двоеточие:

<label for="id_email">Email address:</label>

{{ field.legend_tag }}

Аналогично field.label_tag , но использует тег <legend> вместо <label>, для виджетов с несколькими входами, заключёнными в <fieldset>, для улучшения доступности. Пример использования в шаблоне:
{% if field.use_fieldset %}
  <fieldset>
  {% if field.label %}{{ field.legend_tag }}{% endif %}
{% else %}
  {% if field.label %}{{ field.label_tag }}{% endif %}
{% endif %}
{{ field }}
{% if field.use_fieldset %}</fieldset>{% endif %}
{{ field.value }}
Значение поля. Например, someone@example.com.

См. также

Полный список атрибутов и методов см. в BoundField.

Перебор скрытых и видимых полей

Если вы вручную размещаете форму в шаблоне, в отличие от использования стандартной компоновки формы Django, вы можете по-разному обрабатывать поля <input type="hidden"> от обычных. Например, так как скрытые поля ничего не отображают, размещение сообщений об ошибках «рядом» с полем может сбить пользователей с толку — поэтому для этих полей ошибки следует обрабатывать по-другому.

Django предоставляет два метода для обработки циклов по скрытым и видимым полям независимо: hidden_fields() и visible_fields(). Вот модифицированный пример, использующий эти два метода:

{# Include the hidden fields #}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{# Include the visible fields #}
{% for field in form.visible_fields %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
{% endfor %}

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

Дополнительные темы

Это базовые сведения, но формы могут делать гораздо больше:

  • Наборы форм
    • Использование начальных данных с набором форм
    • Ограничение максимального числа форм
    • Ограничение максимального числа созданных форм
    • Проверка набора форм
    • Проверка количества форм в наборе форм
    • Обработка сортировки и удаления форм
    • Добавление дополнительных полей в набор форм
    • Передача пользовательских параметров формам набора форм
    • Настройка префикса набора форм
    • Использование набора форм в представлениях и шаблонах
  • Создание форм из моделей
    • ModelForm
    • Наборы форм моделей
    • Встроенные наборы форм
  • Актуальные данные форм (класс Media)
    • Актуальные данные как статическое определение
    • Media как динамическое свойство
    • Пути в определениях данных
    • Media объекты
    • Media в формах

См. также

Справочник по формам
Покрывает полную справочную информацию по API, включая поля форм, виджеты форм, и проверку форм и полей.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.0/topics/forms/index/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API