Виджеты¶
Виджет - это представление Django элемента ввода HTML. Виджет обрабатывает рендеринг HTML и извлечение данных из GET/POST словаря, соответствующего виджету.
HTML, создаваемый встроенными виджетами, использует синтаксис HTML5, ориентированный на <!DOCTYPE html>
. Например, он использует булевы атрибуты, такие как checked
, а не стиль XHTML checked='checked'
.
Совет
Виджеты не следует путать с form fields. Поля формы имеют дело с логикой валидации ввода и используются непосредственно в шаблонах. Виджеты имеют дело с визуализацией элементов ввода HTML-формы на веб-странице и извлечением необработанных отправленных данных. Тем не менее, виджеты должны быть assigned к полям форм.
Указание виджетов¶
Всякий раз, когда вы указываете поле в форме, Django будет использовать виджет по умолчанию, соответствующий типу отображаемых данных. Чтобы узнать, какой виджет используется для того или иного поля, смотрите документацию о Встроенные классы Field.
Однако, если вы хотите использовать другой виджет для поля, вы можете использовать аргумент widget
в определении поля. Например:
from django import forms
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField(widget=forms.Textarea)
Это укажет форму с комментарием, которая использует больший виджет Textarea
, а не виджет по умолчанию TextInput
.
Установка аргументов для виджетов¶
Многие виджеты имеют необязательные дополнительные аргументы; их можно установить при определении виджета на поле. В следующем примере атрибут years
установлен для SelectDateWidget
:
from django import forms
BIRTH_YEAR_CHOICES = ['1980', '1981', '1982']
FAVORITE_COLORS_CHOICES = [
('blue', 'Blue'),
('green', 'Green'),
('black', 'Black'),
]
class SimpleForm(forms.Form):
birth_year = forms.DateField(widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES))
favorite_colors = forms.MultipleChoiceField(
required=False,
widget=forms.CheckboxSelectMultiple,
choices=FAVORITE_COLORS_CHOICES,
)
Смотрите Встроенные виджеты для получения дополнительной информации о том, какие виджеты доступны и какие аргументы они принимают.
Виджеты, наследующие от виджета Select
¶
Виджеты, наследующие виджет Select
, имеют дело с выбором. Они представляют пользователю список опций, из которых можно выбирать. Различные виджеты представляют этот выбор по-разному; сам виджет Select
использует представление списка <select>
HTML, а RadioSelect
использует радиокнопки.
Виджеты Select
используются по умолчанию в полях ChoiceField
. Выбор, отображаемый на виджете, наследуется от ChoiceField
, и изменение ChoiceField.choices
приведет к обновлению Select.choices
. Например:
>>> from django import forms
>>> CHOICES = [('1', 'First'), ('2', 'Second')]
>>> choice_field = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICES)
>>> choice_field.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices = []
>>> choice_field.choices = [('1', 'First and only')]
>>> choice_field.widget.choices
[('1', 'First and only')]
Виджеты, предлагающие атрибут choices
, могут использоваться с полями, не основанными на выборе - например, CharField
- но рекомендуется использовать поле, основанное на ChoiceField
, когда выбор присущ модели, а не только представляющему виджету.
Настройка экземпляров виджетов¶
When Django renders a widget as HTML, it only renders very minimal markup -
Django doesn’t add class names, or any other widget-specific attributes. This
means, for example, that all TextInput
widgets will appear the same
on your web pages.
Существует два способа настройки виджетов: per widget instance и per widget class.
Стилизация экземпляров виджетов¶
Если вы хотите, чтобы один экземпляр виджета отличался от другого, вам нужно будет указать дополнительные атрибуты в момент инстанцирования объекта виджета и назначения его полю формы (и, возможно, добавить некоторые правила в ваши CSS-файлы).
Например, возьмем следующую форму:
from django import forms
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField()
Эта форма будет включать три виджета по умолчанию TextInput
, с рендерингом по умолчанию - без CSS класса, без дополнительных атрибутов. Это означает, что поля ввода, предусмотренные для каждого виджета, будут отображаться одинаково:
>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>
On a real web page, you probably don’t want every widget to look the same. You
might want a larger input element for the comment, and you might want the
„name“ widget to have some special CSS class. It is also possible to specify
the „type“ attribute to take advantage of the new HTML5 input types. To do
this, you use the Widget.attrs
argument when creating the widget:
class CommentForm(forms.Form):
name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))
url = forms.URLField()
comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))
Вы также можете изменить виджет в определении формы:
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField()
name.widget.attrs.update({'class': 'special'})
comment.widget.attrs.update(size='40')
Или если поле не объявлено непосредственно на форме (например, поля формы модели), вы можете использовать атрибут Form.fields
:
class CommentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['name'].widget.attrs.update({'class': 'special'})
self.fields['comment'].widget.attrs.update(size='40')
Затем Django включит дополнительные атрибуты в отображаемый вывод:
>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" class="special" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" size="40" required></td></tr>
Вы также можете установить HTML id
, используя attrs
. См. пример BoundField.id_for_label
.
Стилизация классов виджетов¶
С помощью виджетов можно добавлять активы (css
и javascript
) и более глубоко настраивать их внешний вид и поведение.
В двух словах, вам нужно будет создать подкласс виджета и либо define a «Media» inner class, либо create a «media» property.
Эти методы предполагают несколько продвинутое программирование на Python и подробно описаны в руководстве по теме Form Assets.
Базовые классы виджетов¶
Базовые классы виджетов Widget
и MultiWidget
являются подклассами всех built-in widgets и могут служить основой для пользовательских виджетов.
Widget
¶
-
class
Widget
(attrs=None)[исходный код]¶ Этот абстрактный класс не может быть отображен, но предоставляет базовый атрибут
attrs
. Вы также можете реализовать или переопределить методrender()
в пользовательских виджетах.-
attrs
¶ Словарь, содержащий атрибуты HTML, которые должны быть установлены на отображаемом виджете.
>>> from django import forms >>> name = forms.TextInput(attrs={'size': 10, 'title': 'Your name'}) >>> name.render('name', 'A name') '<input title="Your name" type="text" name="name" value="A name" size="10">'
Если присвоить атрибуту значение
True
илиFalse
, он будет отображаться как булев атрибут HTML5:>>> name = forms.TextInput(attrs={'required': True}) >>> name.render('name', 'A name') '<input name="name" type="text" value="A name" required>' >>> >>> name = forms.TextInput(attrs={'required': False}) >>> name.render('name', 'A name') '<input name="name" type="text" value="A name">'
-
supports_microseconds
¶ Атрибут, который по умолчанию имеет значение
True
. Если установлено значениеFalse
, то микросекундная часть значенийdatetime
иtime
будет установлена в0
.
-
format_value
(value)[исходный код]¶ Очищает и возвращает значение для использования в шаблоне виджета.
value
не гарантируется, что это правильный ввод, поэтому реализации подклассов должны программировать защитно.
-
get_context
(name, value, attrs)[исходный код]¶ Возвращает словарь значений для использования при рендеринге шаблона виджета. По умолчанию словарь содержит единственный ключ
'widget'
, который является словарным представлением виджета, содержащим следующие ключи:'name'
: Имя поля из аргументаname
.'is_hidden'
: Булево значение, указывающее, является ли данный виджет скрытым или нет.'required'
: Булево значение, указывающее, является ли поле для этого виджета обязательным.'value'
: Значение, возвращаемое командойformat_value()
.'attrs'
: HTML-атрибуты, которые должны быть установлены на отображаемом виджете. Комбинация атрибутаattrs
и аргументаattrs
.'template_name'
: Значениеself.template_name
.
Widget
Подклассы могут предоставлять пользовательские значения контекста, переопределяя этот метод.
-
id_for_label
(id_)[исходный код]¶ Returns the HTML ID attribute of this widget for use by a
<label>
, given the ID of the field. Returns an empty string if an ID isn’t available.Этот хук необходим, поскольку некоторые виджеты имеют несколько элементов HTML и, следовательно, несколько ID. В этом случае данный метод должен возвращать значение ID, соответствующее первому ID в тегах виджета.
-
render
(name, value, attrs=None, renderer=None)[исходный код]¶ Рендерит виджет в HTML, используя заданный рендерер. Если
renderer
равноNone
, используется рендерер из настройкиFORM_RENDERER
.
-
value_from_datadict
(data, files, name)[исходный код]¶ Учитывая словарь данных и имя этого виджета, возвращает значение этого виджета.
files
может содержать данные, полученные изrequest.FILES
. ВозвращаетNone
, если значение не было предоставлено. Обратите внимание, чтоvalue_from_datadict
может быть вызван более одного раза во время обработки данных формы, поэтому, если вы настраиваете его и добавляете дорогостоящую обработку, вам следует самостоятельно реализовать какой-либо механизм кэширования.
-
value_omitted_from_data
(data, files, name)[исходный код]¶ Учитывая словари
data
иfiles
и имя этого виджета, возвращает наличие или отсутствие данных или файлов для виджета.Результат метода влияет на то, является ли поле в форме модели falls back to its default.
Особыми случаями являются
CheckboxInput
,CheckboxSelectMultiple
иSelectMultiple
, которые всегда возвращаютFalse
, потому что не установленный флажок и не выбранный<select multiple>
не появляются в данных отправки HTML-формы, поэтому неизвестно, отправил пользователь значение или нет.
-
use_fieldset
¶ - New in Django Development version.
Атрибут, определяющий, должен ли виджет быть сгруппирован в
<fieldset>
с<legend>
при отображении. По умолчанию имеет значениеFalse
, но может бытьTrue
, если виджет содержит несколько тегов<input>
, таких какCheckboxSelectMultiple
,RadioSelect
,MultiWidget
,SplitDateTimeWidget
иSelectDateWidget
.
-
use_required_attribute
(initial)[исходный код]¶ Учитывая значение
initial
поля формы, возвращает, может ли виджет быть отображен с атрибутомrequired
HTML. Формы используют этот метод вместе сField.required
иForm.use_required_attribute
, чтобы определить, отображать или нет атрибутrequired
для каждого поля.По умолчанию возвращает
False
для скрытых виджетов иTrue
в противном случае. Особыми случаями являютсяFileInput
иClearableFileInput
, которые возвращаютFalse
, когда установленоinitial
, иCheckboxSelectMultiple
, который всегда возвращаетFalse
, поскольку валидация браузера требует, чтобы все флажки были отмечены, а не хотя бы один.Переопределите этот метод в пользовательских виджетах, которые не совместимы с проверкой браузера. Например, виджет текстового редактора WSYSIWG, поддерживаемый скрытым элементом
textarea
, может захотеть всегда возвращатьFalse
, чтобы избежать проверки браузера на скрытое поле.
-
MultiWidget
¶
-
class
MultiWidget
(widgets, attrs=None)[исходный код]¶ Виджет, состоящий из нескольких виджетов.
MultiWidget
работает рука об руку сMultiValueField
.MultiWidget
имеет один обязательный аргумент:-
widgets
¶ Итерабельность, содержащая необходимые виджеты. Например:
>>> from django.forms import MultiWidget, TextInput >>> widget = MultiWidget(widgets=[TextInput, TextInput]) >>> widget.render('name', ['john', 'paul']) '<input type="text" name="name_0" value="john"><input type="text" name="name_1" value="paul">'
Вы можете предоставить словарь, чтобы указать пользовательские суффиксы для атрибута
name
на каждом субвиджете. В этом случае, для каждой пары(key, widget)
ключ будет добавлен кname
виджета, чтобы сгенерировать значение атрибута. Вы можете указать пустую строку (''
) для одного ключа, чтобы исключить суффикс для одного виджета. Например:>>> widget = MultiWidget(widgets={'': TextInput, 'last': TextInput}) >>> widget.render('name', ['john', 'paul']) '<input type="text" name="name" value="john"><input type="text" name="name_last" value="paul">'
И один необходимый метод:
-
decompress
(value)[исходный код]¶ Этот метод принимает одно «сжатое» значение из поля и возвращает список «распакованных» значений. Входное значение может считаться действительным, но не обязательно непустым.
Этот метод должен быть реализован подклассом, и поскольку значение может быть пустым, реализация должна быть защитной.
Смысл «распаковки» заключается в том, что необходимо «разделить» объединенное значение поля формы на значения для каждого виджета.
Примером может служить то, как
SplitDateTimeWidget
превращает значениеdatetime
в список, в котором дата и время разделены на два отдельных значения:from django.forms import MultiWidget class SplitDateTimeWidget(MultiWidget): # ... def decompress(self, value): if value: return [value.date(), value.time()] return [None, None]
Совет
Обратите внимание, что
MultiValueField
имеет дополнительный методcompress()
с противоположной обязанностью - объединить очищенные значения всех полей-членов в одно.
Это обеспечивает некоторый пользовательский контекст:
-
get_context
(name, value, attrs)[исходный код]¶ In addition to the
'widget'
key described inWidget.get_context()
,MultiWidget
adds awidget['subwidgets']
key.Их можно зациклить в шаблоне виджета:
{% for subwidget in widget.subwidgets %} {% include subwidget.template_name with widget=subwidget %} {% endfor %}
Вот пример виджета, который подклассифицирует
MultiWidget
для отображения даты с днем, месяцем и годом в разных окнах выбора. Этот виджет предназначен для использования сDateField
, а не сMultiValueField
, поэтому мы реализовалиvalue_from_datadict()
:from datetime import date from django import forms class DateSelectorWidget(forms.MultiWidget): def __init__(self, attrs=None): days = [(day, day) for day in range(1, 32)] months = [(month, month) for month in range(1, 13)] years = [(year, year) for year in [2018, 2019, 2020]] widgets = [ forms.Select(attrs=attrs, choices=days), forms.Select(attrs=attrs, choices=months), forms.Select(attrs=attrs, choices=years), ] super().__init__(widgets, attrs) def decompress(self, value): if isinstance(value, date): return [value.day, value.month, value.year] elif isinstance(value, str): year, month, day = value.split('-') return [day, month, year] return [None, None, None] def value_from_datadict(self, data, files, name): day, month, year = super().value_from_datadict(data, files, name) # DateField expects a single string that it can parse into a date. return '{}-{}-{}'.format(year, month, day)
The constructor creates several
Select
widgets in a list. Thesuper()
method uses this list to set up the widget.Необходимый метод
decompress()
разбивает значениеdatetime.date
на значения дня, месяца и года, соответствующие каждому виджету. Если была выбрана недопустимая дата, например, несуществующее 30 февраля,DateField
передает этому методу строку, поэтому ее нужно разобрать. Заключительныйreturn
обрабатывает, когдаvalue
являетсяNone
, то есть у нас нет никаких значений по умолчанию для наших подвиджетов.Реализация по умолчанию
value_from_datadict()
возвращает список значений, соответствующих каждомуWidget
. Это уместно при использованииMultiWidget
сMultiValueField
. Но поскольку мы хотим использовать этот виджет сDateField
, который принимает одно значение, мы переопределили этот метод. Реализация здесь объединяет данные из субвиджетов в строку в формате, который ожидаетDateField
.-
Встроенные виджеты¶
Django предоставляет представление всех основных виджетов HTML, плюс некоторые часто используемые группы виджетов в модуле django.forms.widgets
, включая the input of text, various checkboxes and selectors, uploading files и handling of multi-valued input.
Виджеты, обрабатывающие ввод текста¶
Эти виджеты используют элементы HTML input
и textarea
.
TextInput
¶
-
class
TextInput
[исходный код]¶ input_type
:'text'
template_name
:'django/forms/widgets/text.html'
- Изображается как:
<input type="text" ...>
NumberInput
¶
-
class
NumberInput
[исходный код]¶ input_type
:'number'
template_name
:'django/forms/widgets/number.html'
- Изображается как:
<input type="number" ...>
Имейте в виду, что не все браузеры поддерживают ввод локализованных чисел в типах ввода
number
. Сам Django избегает их использования для полей, у которых свойствоlocalize
установлено вTrue
.
EmailInput
¶
-
class
EmailInput
[исходный код]¶ input_type
:'email'
template_name
:'django/forms/widgets/email.html'
- Изображается как:
<input type="email" ...>
URLInput
¶
-
class
URLInput
[исходный код]¶ input_type
:'url'
template_name
:'django/forms/widgets/url.html'
- Изображается как:
<input type="url" ...>
PasswordInput
¶
-
class
PasswordInput
[исходный код]¶ input_type
:'password'
template_name
:'django/forms/widgets/password.html'
- Изображается как:
<input type="password" ...>
Принимает один необязательный аргумент:
-
render_value
¶ Определяет, будет ли у виджета заполнено значение при повторном отображении формы после ошибки валидации (по умолчанию
False
).
DateInput
¶
-
class
DateInput
[исходный код]¶ input_type
:'text'
template_name
:'django/forms/widgets/date.html'
- Изображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput
, с еще одним необязательным аргументом:-
format
¶ Формат, в котором будет отображаться начальное значение этого поля.
Если аргумент
format
не указан, форматом по умолчанию будет первый формат, найденный вDATE_INPUT_FORMATS
и соответствующий Локализация формата.
DateTimeInput
¶
-
class
DateTimeInput
[исходный код]¶ input_type
:'text'
template_name
:'django/forms/widgets/datetime.html'
- Изображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput
, с еще одним необязательным аргументом:-
format
¶ Формат, в котором будет отображаться начальное значение этого поля.
Если аргумент
format
не указан, форматом по умолчанию будет первый формат, найденный вDATETIME_INPUT_FORMATS
и соответствующий Локализация формата.По умолчанию микросекундная часть значения времени всегда установлена в
0
. Если требуются микросекунды, используйте подкласс с атрибутомsupports_microseconds
, установленным вTrue
.
TimeInput
¶
-
class
TimeInput
[исходный код]¶ input_type
:'text'
template_name
:'django/forms/widgets/time.html'
- Изображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput
, с еще одним необязательным аргументом:-
format
¶ Формат, в котором будет отображаться начальное значение этого поля.
Если аргумент
format
не указан, форматом по умолчанию будет первый формат, найденный вTIME_INPUT_FORMATS
и соответствующий Локализация формата.Об обращении с микросекундами см. в разделе
DateTimeInput
.
Textarea
¶
-
class
Textarea
[исходный код]¶ template_name
:'django/forms/widgets/textarea.html'
- Изображается как:
<textarea>...</textarea>
Виджеты селектора и флажка¶
Эти виджеты используют элементы HTML <select>
, <input type="checkbox">
и <input type="radio">
.
Виджеты, отображающие несколько вариантов выбора, имеют атрибут option_template_name
, который определяет шаблон, используемый для отображения каждого варианта. Например, для виджета Select
, select_option.html
рендерит <option>
для <select>
.
CheckboxInput
¶
-
class
CheckboxInput
[исходный код]¶ input_type
:'checkbox'
template_name
:'django/forms/widgets/checkbox.html'
- Изображается как:
<input type="checkbox" ...>
Принимает один необязательный аргумент:
-
check_test
¶ Вызываемый элемент, который принимает значение
CheckboxInput
и возвращаетTrue
, если флажок должен быть установлен для этого значения.
Select
¶
-
class
Select
[исходный код]¶ template_name
:'django/forms/widgets/select.html'
option_template_name
:'django/forms/widgets/select_option.html'
- Изображается как:
<select><option ...>...</select>
NullBooleanSelect
¶
-
class
NullBooleanSelect
[исходный код]¶ template_name
:'django/forms/widgets/select.html'
option_template_name
:'django/forms/widgets/select_option.html'
Выберите виджет с опциями „Неизвестно“, „Да“ и „Нет“
SelectMultiple
¶
-
class
SelectMultiple
[исходный код]¶ template_name
:'django/forms/widgets/select.html'
option_template_name
:'django/forms/widgets/select_option.html'
Аналогично
Select
, но допускает множественный выбор:<select multiple>...</select>
RadioSelect
¶
-
class
RadioSelect
[исходный код]¶ template_name
:'django/forms/widgets/radio.html'
option_template_name
:'django/forms/widgets/radio_option.html'
Similar to
Select
, but rendered as a list of radio buttons within<div>
tags:<div> <div><input type="radio" name="..."></div> ... </div>
Для более детального контроля над генерируемой разметкой вы можете перебирать радиокнопки в шаблоне. Предположим форму
myform
с полемbeatles
, которое используетRadioSelect
в качестве виджета:<fieldset> <legend>{{ myform.beatles.label }}</legend> {% for radio in myform.beatles %} <div class="myradio"> {{ radio }} </div> {% endfor %} </fieldset>
Это приведет к созданию следующего HTML:
<fieldset> <legend>Radio buttons</legend> <div class="myradio"> <label for="id_beatles_0"><input id="id_beatles_0" name="beatles" type="radio" value="john" required> John</label> </div> <div class="myradio"> <label for="id_beatles_1"><input id="id_beatles_1" name="beatles" type="radio" value="paul" required> Paul</label> </div> <div class="myradio"> <label for="id_beatles_2"><input id="id_beatles_2" name="beatles" type="radio" value="george" required> George</label> </div> <div class="myradio"> <label for="id_beatles_3"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" required> Ringo</label> </div> </fieldset>
Это включает в себя теги
<label>
. Для более детальной настройки можно использовать атрибутыtag
,choice_label
иid_for_label
каждой радиокнопки. Например, этот шаблон…<fieldset> <legend>{{ myform.beatles.label }}</legend> {% for radio in myform.beatles %} <label for="{{ radio.id_for_label }}"> {{ radio.choice_label }} <span class="radio">{{ radio.tag }}</span> </label> {% endfor %} </fieldset>
…приведет к следующему HTML:
<fieldset> <legend>Radio buttons</legend> <label for="id_beatles_0"> John <span class="radio"><input id="id_beatles_0" name="beatles" type="radio" value="john" required></span> </label> <label for="id_beatles_1"> Paul <span class="radio"><input id="id_beatles_1" name="beatles" type="radio" value="paul" required></span> </label> <label for="id_beatles_2"> George <span class="radio"><input id="id_beatles_2" name="beatles" type="radio" value="george" required></span> </label> <label for="id_beatles_3"> Ringo <span class="radio"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" required></span> </label> </fieldset>
If you decide not to loop over the radio buttons – e.g., if your template includes
{{ myform.beatles }}
– they’ll be output in a<div>
with<div>
tags, as above.The outer
<div>
container receives theid
attribute of the widget, if defined, orBoundField.auto_id
otherwise.При переходе по радиокнопкам теги
label
иinput
включают атрибутыfor
иid
соответственно. Каждая радиокнопка имеет атрибутid_for_label
для вывода идентификатора элемента.
CheckboxSelectMultiple
¶
-
class
CheckboxSelectMultiple
[исходный код]¶ template_name
:'django/forms/widgets/checkbox_select.html'
option_template_name
:'django/forms/widgets/checkbox_option.html'
Аналогично
SelectMultiple
, но отображается как список флажков:<div> <div><input type="checkbox" name="..." ></div> ... </div>
The outer
<div>
container receives theid
attribute of the widget, if defined, orBoundField.auto_id
otherwise.
Как и RadioSelect
, вы можете перебирать отдельные флажки для выбора вариантов виджета. В отличие от RadioSelect
, флажки не будут включать HTML-атрибут required
, если поле является обязательным, поскольку проверка браузера потребует, чтобы все флажки были отмечены, а не хотя бы один.
При переборе флажков теги label
и input
включают атрибуты for
и id
соответственно. Каждый флажок имеет атрибут id_for_label
для вывода ID элемента.
Виджеты загрузки файлов¶
FileInput
¶
-
class
FileInput
[исходный код]¶ template_name
:'django/forms/widgets/file.html'
- Изображается как:
<input type="file" ...>
ClearableFileInput
¶
-
class
ClearableFileInput
[исходный код]¶ template_name
:'django/forms/widgets/clearable_file_input.html'
- Отображается как:
<input type="file" ...>
с дополнительным вводом флажка для очистки значения поля, если поле не является обязательным и имеет исходные данные.
Составные виджеты¶
SplitDateTimeWidget
¶
-
class
SplitDateTimeWidget
[исходный код]¶ template_name
:'django/forms/widgets/splitdatetime.html'
Обертка (с использованием
MultiWidget
) вокруг двух виджетов:DateInput
для даты иTimeInput
для времени. Должна использоваться сSplitDateTimeField
, а не сDateTimeField
.SplitDateTimeWidget
имеет несколько необязательных аргументов:-
date_format
¶ Аналогично
DateInput.format
-
time_format
¶ Аналогично
TimeInput.format
-
date_attrs
¶
-
time_attrs
¶ Аналогично
Widget.attrs
. Словарь, содержащий HTML-атрибуты, которые должны быть установлены на отрисованных виджетахDateInput
иTimeInput
соответственно. Если эти атрибуты не установлены, вместо них используетсяWidget.attrs
.
SelectDateWidget
¶
-
class
SelectDateWidget
[исходный код]¶ template_name
:'django/forms/widgets/select_date.html'
Обертка вокруг трех виджетов
Select
: по одному для месяца, дня и года.Принимает несколько необязательных аргументов:
-
years
¶ Необязательный список/кортеж лет для использования в поле выбора «Год». По умолчанию используется список, содержащий текущий год и следующие 9 лет.
-
months
¶ Необязательный набор месяцев для использования в поле выбора «Месяцы».
Ключи диктанта соответствуют номеру месяца (с индексацией 1), а значения - отображаемым месяцам:
MONTHS = { 1:_('jan'), 2:_('feb'), 3:_('mar'), 4:_('apr'), 5:_('may'), 6:_('jun'), 7:_('jul'), 8:_('aug'), 9:_('sep'), 10:_('oct'), 11:_('nov'), 12:_('dec') }
-
empty_label
¶ Если
DateField
не требуется,SelectDateWidget
будет иметь пустой выбор в верхней части списка (по умолчанию это---
). Текст этой метки можно изменить с помощью атрибутаempty_label
.empty_label
может бытьstring
,list
илиtuple
. Если используется строка, все поля выбора будут иметь пустой выбор с этой меткой. Еслиempty_label
являетсяlist
илиtuple
из трех строковых элементов, то поля выбора будут иметь свою собственную пользовательскую метку. Метки должны располагаться в таком порядке('year_label', 'month_label', 'day_label')
.# A custom empty label with string field1 = forms.DateField(widget=SelectDateWidget(empty_label="Nothing")) # A custom empty label with tuple field1 = forms.DateField( widget=SelectDateWidget( empty_label=("Choose Year", "Choose Month", "Choose Day"), ), )