Компоненты формы («виджеты») ¶
Компонент формы - это представление 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
использует представление списка HTML <select>
, но 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
по умолчанию включает три компонента с рендерингом HTML по умолчанию - без класса 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. Также можно определить атрибут «тип», чтобы воспользоваться преимуществами новых типов компонентов 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
) и дополнительно настраивать их внешний вид и поведение.
Говоря коротко, необходимо создать подкласс компонента и либо определить интернет-класс «Медиа», либо создать свойство «медиа» .
Эти методы предполагают относительно продвинутое использование программирования на Python и подробно описаны в тематическом руководстве файлов приложений к формам .
Widget
Базовые классы ¶
Основные классы компонентов 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>
на основе атрибутаid
поля. Возвращает,None
еслиid
недоступен.Эта точка входа необходима, потому что некоторые компоненты имеют несколько HTML-элементов и, следовательно, несколько
id
. В этом случае этот метод должен возвращать значение,id
которое соответствует первомуid
в тегах компонента.
-
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
поля формы возвращает, должен ли отрисовка компонента включать атрибут HTMLrequired
. Формы используют этот метод вместе с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', 'lennon']) '<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()
,MultiValueWidget
добавьте ключwidget['subwidgets']
.Этот цикл можно выполнить в шаблоне компонента:
{% 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)
Конструктор создает несколько компонентов
Select
в списке. Методsuper()
использует этот список для настройки компонента.Обязательный метод
decompress()
разбивает значениеdatetime.date
на отдельные значения дня, месяца и года, соответствующие каждому компоненту. Если выбрана недопустимая дата, например 30 февраля,DateField
то передайте строку этому методу, который должен ее проанализировать. Вreturn
заключительных обрабатывает случай значениеNone
, что означает , что мы не имеем любые значения по умолчанию для наших подкомпонентов.Реализация по умолчанию
value_from_datadict()
возвращает список значений, соответствующих каждомуWidget
. Это правильное поведение, когда компонентMultiWidget
используется вместе с полемMultiValueField
. Но поскольку мы хотим использовать этот компонент с полемDateField
, которое принимает только одно значение, мы переопределили этот метод. Реализация здесь объединяет данные из подкомпонентов в форматированную строку, как и ожидалосьDateField
.-
Встроенные компоненты ¶
В своем модуле django.forms.widgets
Django предоставляет представление всех основных компонентов HTML, а также некоторых групп часто используемых компонентов, включая ввод текста , различные флажки и списки выбора , отправку файлов и обработку ввода. с несколькими значениями .
Компоненты, отвечающие за ввод текста ¶
Эти компоненты используют элементы 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>
Если вы решите не зацикливать переключатели, например, если шаблон содержит , они будут содержаться в элементе с тегами , как указано выше.
{{ myform.beatles }}
<ul>
<li>
<ul>
Верхний контейнер получает атрибутid
компонента, если он определен, илиBoundField.auto_id
иначе.Когда Перебор радиокнопок, то `` ярлык «» и теги
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
, флажки не будут включать атрибут HTML, required
если поле является обязательным, потому что проверка браузера потребует проверки всех полей вместо хотя бы одного.
Когда Перебор флажков, то `` 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
¶ Необязательный словарь месяца для использования в раскрывающемся списке «месяц».
Клавиши словаря соответствуют номеру месяца (индекс от 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
может быть строкой, списком или кортежем. Когда используется строка, все списки выбора будут иметь пустой вариант с этим содержимым. Еслиempty_label
это список или кортеж из трех текстовых элементов, каждый из списков выбора имеет собственное содержимое. Текст должен появиться в следующем порядке: .('texte_année', 'texte_mois', 'texte_jour')
# 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"), ), )