Виджеты ¶
Виджет - это представление Django элемента ввода HTML. Виджет обрабатывает отображение HTML и извлечение данных из словаря GET / POST, который соответствует виджету.
HTML, созданный встроенными виджетами, использует синтаксис HTML5, таргетинг
. Например, он использует логические атрибуты, такие как,
а не стиль XHTML .<!DOCTYPE html>
checked
checked='checked'
Кончик
Виджеты не следует путать с полями формы . Поля формы связаны с логикой проверки ввода и используются непосредственно в шаблонах. Виджеты занимаются отображением элементов ввода HTML-формы на веб-странице и извлечением необработанных отправленных данных. Однако виджеты необходимо назначать полям формы.
Указание виджетов ¶
Каждый раз, когда вы указываете поле в форме, Django будет использовать виджет по умолчанию, соответствующий типу отображаемых данных. Чтобы узнать, какой виджет в каком поле используется, см. Документацию о классах встроенных полей .
Однако, если вы хотите использовать другой виджет для поля, вы можете использовать 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
поле на основе, когда выбор присущ модели, а не только репрезентативному виджету.
Настройка экземпляров виджета ¶
Когда Django отображает виджет как HTML, он отображает только очень минимальную разметку - Django не добавляет имена классов или любые другие атрибуты, специфичные для виджета. Это означает, например, что все TextInput
виджеты будут одинаково отображаться на ваших веб-страницах.
Есть два способа настройки виджетов: для каждого экземпляра виджета и для каждого класса виджета .
Стилизация экземпляров виджета ¶
Если вы хотите, чтобы один экземпляр виджета отличался от другого, вам нужно будет указать дополнительные атрибуты во время создания экземпляра объекта виджета и его назначения полю формы (и, возможно, добавить некоторые правила в ваши файлы 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>
На реальной веб-странице вы, вероятно, не хотите, чтобы все виджеты выглядели одинаково. Возможно, вам понадобится более крупный элемент ввода для комментария, и вы можете захотеть, чтобы виджет «имя» имел какой-то специальный класс CSS. Также можно указать атрибут type, чтобы воспользоваться преимуществами новых типов ввода HTML5. Для этого вы используете Widget.attrs
аргумент при создании виджета:
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
) и более глубоко настраивать их внешний вид и поведение.
Вкратце, вам нужно будет создать подкласс виджета и либо определить внутренний класс «Media», либо создать свойство «media» .
Эти методы включают в себя несколько сложное программирование на Python и подробно описаны в руководстве по ресурсам формы .
Базовые классы виджетов ¶
Базовые классы виджетов Widget
и MultiWidget
являются подклассы на все встроенные виджеты и может служить в качестве основы для пользовательских виджетов.
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
не гарантируется, что это допустимый ввод, поэтому реализации подкласса должны программироваться в защитном порядке.
-
get_context
( имя , значение , атрибуты ) ¶ Возвращает словарь значений для использования при рендеринге шаблона виджета. По умолчанию словарь содержит единственный ключ,
'widget'
который является словарным представлением виджета, содержащего следующие ключи:'name'
: Имя поля изname
аргумента.'is_hidden'
: Логическое значение, указывающее, скрыт ли этот виджет.'required'
: Логическое значение, указывающее, требуется ли поле для этого виджета.'value'
: Значение, возвращаемоеformat_value()
.'attrs'
: Атрибуты HTML, которые должны быть установлены для визуализированного виджета. Комбинацияattrs
атрибута иattrs
аргумента.'template_name'
: Значениеself.template_name
.
Widget
подклассы могут предоставлять настраиваемые значения контекста, переопределяя этот метод.
-
id_for_label
( id_ ) ¶ Возвращает атрибут HTML ID этого виджета для использования с
<label>
заданным идентификатором поля. Возвращает,None
если идентификатор недоступен.Этот хук необходим, потому что некоторые виджеты имеют несколько элементов HTML и, следовательно, несколько идентификаторов. В этом случае этот метод должен возвращать значение идентификатора, соответствующее первому идентификатору в тегах виджета.
-
render
( имя , значение , attrs = None , renderer = None ) ¶ Визуализирует виджет в HTML с использованием данного средства визуализации. Если
renderer
естьNone
, используется средство визуализации изFORM_RENDERER
настройки.
-
value_from_datadict
( данные , файлы , имя ) ¶ Учитывая словарь данных и имя этого виджета, возвращает значение этого виджета.
files
может содержать данные, поступающие изrequest.FILES
. Возвращает,None
если значение не было предоставлено. Также обратите внимание, чтоvalue_from_datadict
во время обработки данных формы может вызываться более одного раза, поэтому, если вы настроите его и добавите дорогостоящую обработку, вам следует реализовать некоторый механизм кэширования самостоятельно.
-
value_omitted_from_data
( данные , файлы , имя ) ¶ Дано
data
иfiles
словари и имя этого виджета, возвращает информацию о том, есть ли данные или файлы для виджета.Результат метода влияет на то, возвращается ли поле в форме модели к своему значению по умолчанию .
Особые случаи
CheckboxInput
,CheckboxSelectMultiple
иSelectMultiple
, которые всегда возвращаются ,False
потому что неконтролируемый флажок и невыбранный не отображается в данных о качестве представления HTML формы, так что неизвестно , представляется ли или нет пользователя значения.<select multiple>
-
use_required_attribute
( начальная ) ¶ По заданному
initial
значению поля формы возвращает, можно ли отобразить виджет сrequired
атрибутом HTML. Формы используют этот метод вместе сField.required
и,Form.use_required_attribute
чтобы определить, отображать лиrequired
атрибут для каждого поля.По умолчанию возвращается
False
для скрытых виджетов и вTrue
противном случае. Особые случаи - этоFileInput
иClearableFileInput
, которые возвращаются,False
когдаinitial
установлено, иCheckboxSelectMultiple
, которое всегда возвращается,False
потому что проверка браузера потребовала бы, чтобы были отмечены все флажки, а не хотя бы один.Переопределите этот метод в пользовательских виджетах, несовместимых с проверкой браузера. Например, виджет текстового редактора WSYSIWG, поддерживаемый скрытым
textarea
элементом, может захотеть всегда возвращаться,False
чтобы избежать проверки браузером скрытого поля.Изменено в Django 3.1:В более старых версиях
True
возвращалось,FileInput
когдаinitial
было установлено.
-
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
( значение ) ¶ Этот метод берет одно «сжатое» значение из поля и возвращает список «распакованных» значений. Входное значение можно считать действительным, но не обязательно непустым.
Этот метод должен быть реализован подклассом, и поскольку значение может быть пустым, реализация должна быть защитной.
Обоснование «декомпрессии» состоит в том, что необходимо «разбить» объединенное значение поля формы на значения для каждого виджета.
Примером этого является то, как
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
( имя , значение , атрибуты ) ¶ В дополнение к
'widget'
ключу, описанному вWidget.get_context()
,MultiWidget
добавляетwidget['subwidgets']
ключ.Их можно перебрать в шаблоне виджета:
{% for subwidget in widget.subwidgets %} {% include subwidget.template_name with widget=subwidget %} {% endfor %}
Вот пример виджета, подклассы которого
MultiWidget
для отображения даты с днем, месяцем и годом в разных полях выбора. Этот виджет предназначен для использования с a,DateField
а не с aMultiValueField
, поэтому мы реализовали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)
Конструктор создает несколько
Select
виджетов в виде списка.super()
Метод использует этот список для настройки виджета.Требуемый метод
decompress()
разбиваетdatetime.date
значение на значения дня, месяца и года, соответствующие каждому виджету. Если была выбрана недопустимая дата, например несуществующее 30 февраля,DateField
вместо этого метод передает строку, поэтому ее необходимо проанализировать. Последний определяет ,return
когдаvalue
естьNone
, что означает, что у нас нет значений по умолчанию для наших подвиджетов.Реализация по умолчанию
value_from_datadict()
возвращает список значений, соответствующих каждомуWidget
. Это уместно при использованииMultiWidget
сMultiValueField
. Но поскольку мы хотим использовать этот виджет с aDateField
, который принимает одно значение, мы переопределили этот метод. Реализация здесь объединяет данные из подвиджетов в строку в ожидаемом форматеDateField
.-
Встроенные виджеты ¶
Django предоставляет представление всех основных виджетов HTML, а также некоторых часто используемых групп виджетов в django.forms.widgets
модуле, включая ввод текста , различные флажки и селекторы , загрузку файлов и обработку многозначного ввода .
Виджеты, обрабатывающие ввод текста ¶
Эти виджеты используют элементы HTML input
и textarea
.
TextInput
¶
-
класс
TextInput
¶ input_type
:'text'
template_name
:'django/forms/widgets/text.html'
- Отображается как:
<input type="text" ...>
NumberInput
¶
-
класс
NumberInput
¶ input_type
:'number'
template_name
:'django/forms/widgets/number.html'
- Отображается как:
<input type="number" ...>
Помните, что не все браузеры поддерживают ввод локализованных чисел в
number
типы ввода. Сам Django избегает их использования для полей, для которыхlocalize
установлено свойствоTrue
.
EmailInput
¶
-
класс
EmailInput
¶ input_type
:'email'
template_name
:'django/forms/widgets/email.html'
- Отображается как:
<input type="email" ...>
URLInput
¶
-
класс
URLInput
¶ input_type
:'url'
template_name
:'django/forms/widgets/url.html'
- Отображается как:
<input type="url" ...>
PasswordInput
¶
-
класс
PasswordInput
¶ input_type
:'password'
template_name
:'django/forms/widgets/password.html'
- Отображается как:
<input type="password" ...>
Принимает один необязательный аргумент:
-
render_value
¶ Определяет, будет ли виджет иметь заполненное значение при повторном отображении формы после ошибки проверки (по умолчанию
False
).
DateInput
¶
-
класс
DateInput
¶ input_type
:'text'
template_name
:'django/forms/widgets/date.html'
- Отображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput
, с еще одним необязательным аргументом:-
format
¶ Формат, в котором будет отображаться начальное значение этого поля.
Если ни один
format
аргумент не предусмотрен формат по умолчанию является первым форматом найден вDATE_INPUT_FORMATS
и отношениях локализации Формата .
DateTimeInput
¶
-
класс
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
¶
-
класс
TimeInput
¶ input_type
:'text'
template_name
:'django/forms/widgets/time.html'
- Отображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput
, с еще одним необязательным аргументом:-
format
¶ Формат, в котором будет отображаться начальное значение этого поля.
Если ни один
format
аргумент не предусмотрен формат по умолчанию является первым форматом найден вTIME_INPUT_FORMATS
и отношениях локализации Формата .Об обработке микросекунд см
DateTimeInput
.
Селектор и виджеты флажков ¶
Эти виджеты делают использование HTML - элементов <select>
,
и .<input type="checkbox">
<input type="radio">
Виджеты, отображающие несколько вариантов выбора, имеют option_template_name
атрибут, определяющий шаблон, используемый для отображения каждого варианта. Например, для
Select
виджета select_option.html
рендеринг <option>
для
<select>
.
CheckboxInput
¶
-
класс
CheckboxInput
¶ input_type
:'checkbox'
template_name
:'django/forms/widgets/checkbox.html'
- Отображается как:
<input type="checkbox" ...>
Принимает один необязательный аргумент:
-
check_test
¶ Вызываемый объект, который принимает значение
CheckboxInput
и возвращает,True
если флажок должен быть установлен для этого значения.
Select
¶
-
класс
Select
¶ template_name
:'django/forms/widgets/select.html'
option_template_name
:'django/forms/widgets/select_option.html'
- Отображается как:
<select><option ...>...</select>
NullBooleanSelect
¶
-
класс
NullBooleanSelect
¶ template_name
:'django/forms/widgets/select.html'
option_template_name
:'django/forms/widgets/select_option.html'
Выберите виджет с вариантами «Неизвестно», «Да» и «Нет».
SelectMultiple
¶
RadioSelect
¶
-
класс
RadioSelect
¶ template_name
:'django/forms/widgets/radio.html'
option_template_name
:'django/forms/widgets/radio_option.html'
Аналогично
Select
, но отображается в виде списка переключателей внутри<li>
тегов:<ul> <li><input type="radio" name="..."></li> ... </ul>
Для более детального управления сгенерированной разметкой вы можете перебирать переключатели в шаблоне. Предположим, что форма
myform
с полемbeatles
использует вRadioSelect
качестве виджета:{% for radio in myform.beatles %} <div class="myradio"> {{ radio }} </div> {% endfor %}
Это сгенерирует следующий HTML:
<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>
Это включало
<label>
теги. Чтобы получить более зернистая, вы можете использовать для каждой кнопки радиостанцииtag
,choice_label
иid_for_label
атрибуты. Например, этот шаблон…{% for radio in myform.beatles %} <label for="{{ radio.id_for_label }}"> {{ radio.choice_label }} <span class="radio">{{ radio.tag }}</span> </label> {% endfor %}
… Приведет к следующему HTML:
<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>
Если вы решите не перебирать переключатели - например, если ваш шаблон включает - они будут выведены в тегах with , как указано выше.
{{ myform.beatles }}
<ul>
<li>
Внешний
<ul>
контейнер получаетid
атрибут виджета, если он определен, илиBoundField.auto_id
иначе.Когда цикл по радио кнопки, то
label
иinput
теги включаютfor
иid
атрибуты, соответственно. У каждой радиокнопки естьid_for_label
атрибут для вывода идентификатора элемента.
CheckboxSelectMultiple
¶
-
класс
CheckboxSelectMultiple
¶ template_name
:'django/forms/widgets/checkbox_select.html'
option_template_name
:'django/forms/widgets/checkbox_option.html'
Аналогично
SelectMultiple
, но отображается в виде списка флажков:<ul> <li><input type="checkbox" name="..." ></li> ... </ul>
Внешний
<ul>
контейнер получаетid
атрибут виджета, если он определен, илиBoundField.auto_id
иначе.
Например RadioSelect
, вы можете перебирать отдельные флажки для выбора виджета. В отличие от этого RadioSelect
, флажки не будут включать
required
атрибут HTML, если поле является обязательным, потому что проверка браузера потребует проверки всех флажков, а не хотя бы одного.
Когда цикл над флажками, то label
и input
теги включают
for
и id
атрибуты, соответственно. У каждого флажка есть
id_for_label
атрибут для вывода идентификатора элемента.
Виджеты загрузки файлов ¶
Составные виджеты ¶
SplitDateTimeWidget
¶
-
класс
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
¶
-
класс
SelectDateWidget
¶ template_name
:'django/forms/widgets/select_date.html'
Обертка вокруг трех
Select
виджетов: по одному для месяца, дня и года.Принимает несколько необязательных аргументов:
-
years
¶ Необязательный список / кортеж лет для использования в поле выбора «год». По умолчанию это список, содержащий текущий год и следующие 9 лет.
-
months
¶ Необязательный указатель месяцев для использования в поле выбора «месяцы».
Клавиши dict соответствуют номеру месяца (с индексом 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
3 строковых элемента, поля выбора будут иметь свою собственную метку. Этикетки должны быть в таком порядке .('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"), ), )