Виджеты
Виджет — это представление Django для HTML-элемента ввода. Виджет обрабатывает рендеринг HTML и извлечение данных из словаря GET/POST, соответствующего виджету.
HTML, генерируемый встроенными виджетами, использует синтаксис HTML5, ориентируясь на <!DOCTYPE html>. Например, он использует булевы атрибуты, такие как checked, а не стиль XHTML 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 по умолчанию с рендерингом по умолчанию — без 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) и более глубоко настраивать их внешний вид и поведение.
Вкратце, вам нужно будет унаследовать от виджета и либо определить внутренний класс «Media», либо создать свойство «media».
Эти методы включают в себя довольно продвинутое программирование на Python и подробно описаны в руководстве по теме Ресурсы форм.
Базовые классы виджетов
Базовые классы виджетов Widget и MultiWidget наследуются всеми встроенными виджетами и могут служить основой для пользовательских виджетов.
Widget
-
class Widget(attrs=None)[source] -
Этот абстрактный класс не может быть отображён, но предоставляет базовый атрибут
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)[source] -
Очищает и возвращает значение для использования в шаблоне виджета.
valueне гарантируется, что будет действительным вводом, поэтому реализации подклассов должны быть защищены от него.
-
get_context(name, value, attrs)[source] -
Добавлено в Django 1.11.
Возвращает словарь значений для использования при отображении шаблона виджета. По умолчанию словарь содержит единственный ключ,
'widget', который представляет собой словарь представления виджета, содержащий следующие ключи:-
'name': Имя поля из аргументаname. -
'is_hidden': Булево значение, указывающее, скрыт ли этот виджет. -
'required': Булево значение, указывающее, обязательно ли поле для этого виджета. -
'value': Значение, возвращённоеformat_value(). -
'attrs': HTML атрибуты, которые должны быть установлены для отображаемого виджета. Объединение атрибутаattrsи аргументаattrs. -
'template_name': Значениеself.template_name.
Подклассы
Widgetмогут предоставлять пользовательские значения контекста, переопределяя этот метод. -
-
id_for_label(id_)[source] -
Возвращает атрибут HTML ID этого виджета для использования
<label>, учитывая ID поля. ВозвращаетNoneесли ID недоступен.Этот обработчик необходим, потому что некоторые виджеты имеют несколько HTML-элементов и, следовательно, несколько ID. В этом случае этот метод должен возвращать значение ID, соответствующее первому ID в тегах виджета.
-
render(name, value, attrs=None, renderer=None)[source] -
Отображает виджет в HTML с использованием заданного рендерера. Если
rendererравноNone, используется рендерер из настройкиFORM_RENDERER.Изменено в Django 1.11:Добавлен аргумент
renderer.
-
value_from_datadict(data, files, name)[source] -
Учитывая словарь данных и имя этого виджета, возвращает значение этого виджета.
filesможет содержать данные, поступающие изrequest.FILES. ВозвращаетNoneесли значение не было предоставлено. Обратите также внимание, чтоvalue_from_datadictможет вызываться более одного раза во время обработки данных формы, поэтому, если вы его настраиваете и добавляете дорогостоящую обработку, вы должны самостоятельно реализовать механизм кэширования.
-
value_omitted_from_data(data, files, name)[source] -
Учитывая словари
dataиfilesи имя этого виджета, возвращает, есть ли данные или файлы для виджета.Результат метода влияет на то, обратится ли поле в форме модели к своему значению по умолчанию.
Особые случаи:
CheckboxInput,CheckboxSelectMultipleиSelectMultiple, которые всегда возвращаютFalse, так как не отмеченный чекбокс и невыбранный<select multiple>не появляются в данных отправки HTML-формы, поэтому неизвестно, предоставил ли пользователь значение.
-
use_required_attribute(initial)[source] -
Учитывая значение поля формы
initial, возвращает, можно ли отобразить виджет с атрибутом HTMLrequired.Формы используют этот метод вместе с
Field.requiredиForm.use_required_attribute, чтобы определить, отображать или нет атрибутrequiredдля каждого поля.По умолчанию возвращает
Falseдля скрытых виджетов иTrueв противном случае. Особые случаи:ClearableFileInput, который возвращаетFalseкогдаinitialне установлено, иCheckboxSelectMultiple, который всегда возвращаетFalse, потому что для валидации браузера необходимо, чтобы все флажки были установлены, а не хотя бы один.Переопределите этот метод в пользовательских виджетах, которые несовместимы с валидацией браузера. Например, виджет WYSIWYG-редактора, поддерживаемый скрытым элементом
textarea, может захотеть всегда возвращатьFalseчтобы избежать проверки браузера для скрытого поля.
-
MultiWidget
-
class MultiWidget(widgets, attrs=None)[source] -
Виджет, состоящий из нескольких виджетов.
MultiWidgetработает совместно сMultiValueField.MultiWidgetимеет один обязательный аргумент:-
widgets -
Итерируемый объект, содержащий необходимые виджеты.
И один обязательный метод:
-
decompress(value)[source] -
Этот метод принимает одно «сжатое» значение из поля и возвращает список «разжатых» значений. Входное значение можно считать допустимым, но не обязательно непустым.
Этот метод обязательно должен быть реализован подклассом, и поскольку значение может быть пустым, реализация должна быть защищённой.
Основание для «разжатия» заключается в том, что необходимо «разделить» объединённое значение поля формы на значения для каждого виджета.
Пример этого — как
SplitDateTimeWidgetпреобразует значениеdatetimeв список с разделением даты и времени на два отдельных значения:from django.forms import MultiWidget class SplitDateTimeWidget(MultiWidget): # ... def decompress(self, value): if value: return [value.date(), value.time().replace(microsecond=0)] return [None, None]Подсказка
Обратите внимание, что
MultiValueFieldимеет дополнительный методcompress()с обратной задачей — объединить очищенные значения всех членов в одно.
Он предоставляет некоторый пользовательский контекст:
-
get_context(name, value, attrs)[source] -
В дополнение к ключу
'widget', описанному вWidget.get_context(),MultiValueWidgetдобавляет ключwidget['subwidgets'].Эти ключи можно перебрать в шаблоне виджета:
{% for subwidget in widget.subwidgets %} {% include widget.template_name with widget=subwidget %} {% endfor %}
Вот пример виджета, который наследуется от
MultiWidgetдля отображения даты с днём, месяцем и годом в разных раскрывающихся списках. Этот виджет предназначен для использования сDateField, а не сMultiValueField, поэтому мы реализовалиvalue_from_datadict():from datetime import date from django.forms import widgets class DateSelectorWidget(widgets.MultiWidget): def __init__(self, attrs=None): # create choices for days, months, years # example below, the rest snipped for brevity. years = [(year, year) for year in (2011, 2012, 2013)] _widgets = ( widgets.Select(attrs=attrs, choices=days), widgets.Select(attrs=attrs, choices=months), widgets.Select(attrs=attrs, choices=years), ) super().__init__(_widgets, attrs) def decompress(self, value): if value: return [value.day, value.month, value.year] return [None, None, None] def value_from_datadict(self, data, files, name): datelist = [ widget.value_from_datadict(data, files, name + '_%s' % i) for i, widget in enumerate(self.widgets)] try: D = date( day=int(datelist[0]), month=int(datelist[1]), year=int(datelist[2]), ) except ValueError: return '' else: return str(D)Конструктор создаёт несколько виджетов
Selectв кортеже. Классsuperиспользует этот кортеж для настройки виджета.Необходимый метод
decompress()разбивает значениеdatetime.dateна значения дня, месяца и года, соответствующие каждому виджету. Обратите внимание, как метод обрабатывает случай, когдаvalueравноNone.Встроенная реализация
value_from_datadict()возвращает список значений, соответствующих каждомуWidget. Это подходит при использовании сMultiWidgetиMultiValueField, но поскольку мы хотим использовать этот виджет сDateField, который принимает одно значение, мы переопределили этот метод для объединения данных всех подвиджетов вdatetime.date. Метод извлекает данные из словаряPOSTи строит и проверяет дату. Если она верна, мы возвращаем строку, в противном случае — пустую строку, что заставитform.is_validвернутьFalse. -
Встроенные виджеты
Django предоставляет представление всех основных HTML-виджетов, а также некоторых часто используемых групп виджетов в модуле django.forms.widgets , включая ввод текста, различные флажки и раскрывающиеся списки, загрузку файлов и обработку многозначного ввода.
Обработка ввода текста
Эти виджеты используют HTML-элементы input и textarea.
TextInput
-
class TextInput[source] -
-
input_type:'text' -
template_name:'django/forms/widgets/text.html' - Отображается как:
<input type="text" ...>
-
NumberInput
-
class NumberInput[source] -
-
input_type:'number' -
template_name:'django/forms/widgets/number.html' - Отображается как:
<input type="number" ...>
Обратите внимание, что не все браузеры поддерживают ввод локальных чисел в типах ввода
number. Сам Django избегает их использования для полей, у которых свойствоlocalizeустановлено вTrue. -
EmailInput
-
class EmailInput[source] -
-
input_type:'email' -
template_name:'django/forms/widgets/email.html' - Отображается как:
<input type="email" ...>
-
URLInput
-
class URLInput[source] -
-
input_type:'url' -
template_name:'django/forms/widgets/url.html' - Отображается как:
<input type="url" ...>
-
PasswordInput
-
class PasswordInput[source] -
-
input_type:'password' -
template_name:'django/forms/widgets/password.html' - Отображается как:
<input type="password" ...>
Принимает один необязательный аргумент:
-
render_value -
Определяет, будет ли у виджета заполненное значение при повторном отображении формы после ошибки валидации (по умолчанию
False).
-
HiddenInput
DateInput
-
class DateInput[source] -
-
input_type:'text' -
template_name:'django/forms/widgets/date.html' - Отображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput, с одним дополнительным необязательным аргументом:-
format -
Формат, в котором будет отображено начальное значение этого поля.
Если аргумент
formatне указан, по умолчанию используется первый формат, найденный вDATE_INPUT_FORMATS, и учитывается Локализация форматов. -
DateTimeInput
-
class DateTimeInput[source] -
-
input_type:'text' -
template_name:'django/forms/widgets/datetime.html' - Renders as:
<input type="text" ...>
Takes same arguments as
TextInput, with one more optional argument:-
format -
Формат, в котором будет отображаться начальное значение этого поля.
Если аргумент
formatне задан, используется первый формат, найденный вDATETIME_INPUT_FORMATS, и учитывается Локализация формата.По умолчанию, микросекундная часть значения времени всегда устанавливается в
0. Если требуются микросекунды, используйте подкласс с атрибутомsupports_microseconds, установленным вTrue. -
TimeInput
-
class TimeInput[source] -
-
input_type:'text' -
template_name:'django/forms/widgets/time.html' - Renders as:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput, с одним дополнительным необязательным аргументом:-
format -
Формат, в котором будет отображаться начальное значение этого поля.
Если аргумент
formatне задан, используется первый формат, найденный вTIME_INPUT_FORMATS, и учитывается Локализация формата.Обработка микросекунд описана в
DateTimeInput. -
Textarea
-
class Textarea[source] -
-
template_name:'django/forms/widgets/textarea.html' - Renders as:
<textarea>...</textarea>
-
Selector and checkbox widgets
Эти виджеты используют HTML-элементы <select>, <input type="checkbox">, и <input type="radio">.
Виджеты, отображающие несколько вариантов, имеют атрибут option_template_name, который определяет шаблон для отображения каждого варианта. Например, для виджета Select, select_option.html отображает <option> для <select>.
CheckboxInput
-
class CheckboxInput[source] -
-
input_type:'checkbox' -
template_name:'django/forms/widgets/checkbox.html' - Renders as:
<input type="checkbox" ...>
Принимает один необязательный аргумент:
-
check_test -
Функция, принимающая значение
CheckboxInputи возвращающаяTrue, если чекбокс должен быть отмечен для этого значения.
-
Select
-
class Select[source] -
-
template_name:'django/forms/widgets/select.html' -
option_template_name:'django/forms/widgets/select_option.html' - Renders as:
<select><option ...>...</select>
-
choices -
Этот атрибут необязателен, если у поля формы нет атрибута
choices. Если он есть, он переопределяет любые ваши настройки, установленные здесь, когда этот атрибут обновляется вField.
-
NullBooleanSelect
-
class NullBooleanSelect[source] -
-
template_name:'django/forms/widgets/select.html' -
option_template_name:'django/forms/widgets/select_option.html'
Виджет выбора с вариантами ‘Неизвестно’, ‘Да’ и ‘Нет’
-
SelectMultiple
-
class SelectMultiple[source] -
-
template_name:'django/forms/widgets/select.html' -
option_template_name:'django/forms/widgets/select_option.html'
Аналогично
Select, но позволяет множественный выбор:<select multiple="multiple">...</select> -
RadioSelect
-
class RadioSelect[source] -
-
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в противном случае.При переборе радиокнопок теги
labelиinputвключают атрибутыforиid, соответственно. Каждая радиокнопка имеет атрибутid_for_labelдля вывода ID элемента. -
CheckboxSelectMultiple
-
class CheckboxSelectMultiple[source] -
-
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 для вывода ID элемента.
Виджеты загрузки файлов
FileInput
-
class FileInput[source] -
-
template_name:'django/forms/widgets/file.html' - Renders as:
<input type="file" ...>
-
ClearableFileInput
-
class ClearableFileInput[source] -
-
template_name:'django/forms/widgets/clearable_file_input.html' - Renders as:
<input type="file" ...>с дополнительным чекбоксом для очистки значения поля, если поле не обязательно и имеет начальные данные.
-
Составные виджеты
MultipleHiddenInput
-
class MultipleHiddenInput[source] -
-
template_name:'django/forms/widgets/multiple_hidden.html' - Отображается как: несколько тегов
<input type="hidden" ...>
Компонент, обрабатывающий несколько скрытых элементов управления для полей с списком значений.
-
choices -
Этот атрибут необязателен, если поле формы не имеет атрибута
choices. Если он есть, он переопределит любое значение, заданное здесь, при обновлении атрибута вField.
-
SplitDateTimeWidget
-
class SplitDateTimeWidget[source] -
-
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 -
Добавлена в Django 2.0.
Аналогично
Widget.attrs. Словарь, содержащий HTML-атрибуты, которые будут установлены для рендеринга виджетовDateInputиTimeInputсоответственно. Если эти атрибуты не установлены, используетсяWidget.attrs.
-
SplitHiddenDateTimeWidget
SelectDateWidget
-
class SelectDateWidget[source] -
-
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из 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"), ), )
-
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.0/ref/forms/widgets/