Работа с формами
О документе
Данный документ предоставляет введение в основы веб-форм и как они обрабатываются в 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, как правило,:
- получаем его в представлении (например, извлекаем его из базы данных)
- передаем его в контекст шаблона
- преобразуем его в 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>
Это сообщает браузеру вернуть данные формы по адресу /your-name/, используя метод POST. Он отобразит текстовое поле с меткой «Ваше имя:» и кнопку «ОК». Если контекст шаблона содержит переменную current_name, она будет использована для предварительного заполнения поля your_name.
Вам понадобится представление, которое отображает шаблон, содержащий HTML-форму, и которое может предоставить поле current_name как нужно.
При отправке формы запрос POST, отправленный на сервер, будет содержать данные формы.
Теперь вам также понадобится представление, соответствующее адресу URL /your-name/, которое найдёт соответствующие пары ключ/значение в запросе и обработает их.
Это очень простая форма. На практике форма может содержать десятки или сотни полей, многие из которых могут потребоваться заполнить предварительно, и мы можем ожидать, что пользователь несколько раз пройдёт цикл редактирования-отправки, прежде чем завершит операцию.
Мы можем потребовать некоторой проверки в браузере, даже прежде чем форма будет отправлена; мы можем захотеть использовать более сложные поля, которые позволяют пользователю, например, выбирать даты из календаря и так далее.
В этот момент гораздо проще поручить Django большую часть этой работы.
Создание формы в Django
Класс Form
Мы уже знаем, как должна выглядеть наша HTML-форма. Наш отправной пункт для этого в Django — это:
forms.pyfrom 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.pyfrom 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 будет использовать url, email и number типы ввода HTML5. По умолчанию браузеры могут применять собственную валидацию к этим полям, которая может быть строже, чем валидация 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.pyfrom 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.pyfrom 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.pyfrom 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 для получения более подробной информации.
Многократно используемые шаблоны групп полей
Каждое поле доступно в качестве атрибута формы, используя {{ 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 }} -
Имя поля, которое будет использоваться в поле имени элемента ввода. Это учитывает префикс формы, если он установлен.
-
{{ field.id_for_label }} -
Идентификатор, который будет использоваться для этого поля (
id_emailв примере выше). Если вы вручную создаете метку, вы можете использовать её вместоlabel_tag. Это также полезно, например, если у вас есть какой-то встроенный JavaScript и вы хотите избежать жёсткого кодирования идентификатора поля. -
{{ 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>. -
{{ field.use_fieldset }} -
Этот атрибут равен
True, если виджет поля формы содержит несколько элементов ввода, которые должны быть семантически сгруппированы в<fieldset>с<legend>для повышения доступности. Пример использования в шаблоне:
{% 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.
Дополнительные темы
Это базовые сведения, но формы могут делать гораздо больше:
-
Наборы форм
- Использование начальных данных с набором форм
- Ограничение максимального количества форм
- Ограничение максимального количества созданных форм
- Валидация набора форм
- Валидация количества форм в наборе форм
- Работа с порядком и удалением форм
- Добавление дополнительных полей в набор форм
- Передача пользовательских параметров формам набора форм
- Настройка префикса набора форм
- Использование набора форм в представлениях и шаблонах
- Создание форм из моделей
-
Активные элементы форм (класс
Media)
См. также
- Справочник по формам
-
Покрывает полную справочную информацию по API, включая поля форм, виджеты форм и валидацию форм и полей.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/topics/forms/index/