Виджеты¶
Виджет – это представление поля в виде HTML кода. Виджеты обеспечивают генерацию HTML и извлечение соответствующих данных из GET/POST запросов.
HTML, созданный встроенными виджетами, использует синтаксис HTML5, ориентированный на <!DOCTYPE html>. Например, он использует логические атрибуты, такие как checked, а не стиль XHTML checked='checked'.
Совет
Не следует путать виджеты с полями формы. Поля формы обеспечивают логику проверки вводимой информации и используются в шаблонах. Виджеты же отвечают за рендеринг форм на веб-странице и обработку переданных данных. Тем не менее, виджеты следует назначать на поля формы.
Назначение виджета¶
При добавлении поля на форму, Django использует стандартный виджет, наиболее подходящий к отображаемому типу данных. Для того, чтобы узнать какой виджет использует интересующий вас тип поля обратитесь к built-in fields.
Тем не менее, если потребуется указать другой виджет для поля, просто используйте аргумент widget при определении поля. Например:
from django import forms
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField(widget=forms.Textarea)
Этот код создают форму, у которой полю комментария назначен виджет class:Textarea вместо стандартного TextInput widget.
Аргументы виджетов¶
Большинство виджетов принимают дополнительные аргументы. Они могут быть назначены при определении виджета для поля. В следующем примере атрибут 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 для полей имени и комментариев, а также виджет URLInput для поля URL. Каждый из них имеет рендеринг по умолчанию — ни класса CSS, ни дополнительных атрибутов:
>>> f = CommentForm(auto_id=False)
>>> print(f)
<div>Name:<input type="text" name="name" required></div>
<div>Url:<input type="url" name="url" required></div>
<div>Comment:<input type="text" name="comment" required></div>
На реальной веб-странице вы, вероятно, захотите настроить это. Возможно, вам понадобится более крупный элемент ввода для комментария, а также вы можете захотеть, чтобы виджет «имя» имел какой-то специальный класс 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 добавит дополнительные атрибуты в генерируемый HTML код:
>>> f = CommentForm(auto_id=False)
>>> print(f)
<div>Name:<input type="text" name="name" class="special" required></div>
<div>Url:<input type="url" name="url" required></div>
<div>Comment:<input type="text" name="comment" size="40" required></div>
Вы также можете указать HTML id используя attrs. Смотрите BoundField.id_for_label.
Настройка классов виджета¶
Для виджетов можно добавлять медиа файлы (css и javascript) для более глубокой настройки их внешнего вида и поведения.
Вкратце, вам потребуется унаследовать виджет и либо определить класс «Media», либо создать свойство «media», возвращающее экземпляр этого класса.
Эти методы требуют некоторого объёма продвинутого кода и подробно описаны в руководстве по ресурсам форм.
Основные классы виджетов¶
Основные классы виджетов Widget и MultiWidget унаследованы всеми встроенными виджетами и могут являться основой для ваших собственных виджетов.
Виджеты¶
- 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(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_)¶
Возвращает атрибут HTML ID этого виджета для использования
<label>, учитывая идентификатор поля. Возвращает пустую строку, если идентификатор недоступен.Этот метод необходим т.к. некоторые виджеты состоят из нескольких HTML элеентов с разными ID. В этом случает метод должен вернуть ID первого тега виджета.
- render(name, value, attrs=None, renderer=None)¶
Отрисовывает виджет в HTML, используя заданный модуль визуализации. Если
рендереримеет значениеНет, используется рендерер из настройкиFORM_RENDERER.
- value_from_datadict(data, files, name)¶
Принимает словарь с данными и имя виджета.
filesможет содержать данные изrequest.FILES. ВозвращаетNone, если значение не найдено. Обратите внимание,value_from_datadictможет вызываться несколько раз при обработке данных в форме. Если вы добавите медленные операции в этот метод, позаботьтесь о кешировании результата.
- value_omitted_from_data(data, files, name)¶
Принимает словарь данных и имя виджета, возвращает значения для этого виджета. Возвращает
None, если значение не предоставлено.Результат метода влияет на то, вернется ли поле в форме модели к значению по умолчанию <topics-modelform-save>.
Особыми случаями являются
CheckboxInput,CheckboxSelectMultipleиSelectMultiple, которые всегда возвращаютFalse, поскольку неотмеченный флажок и невыбранный<select Multiple>не появляются в данных отправки HTML-формы, поэтому неизвестно, или нет, пользователь отправил значение.
- use_fieldset¶
Атрибут, определяющий, должен ли виджет быть сгруппирован в
<fieldset>с<legend>при отображении. По умолчанию установлено значение «False», но значение «True», когда виджет содержит несколько тегов «<input>», таких какCheckboxSelectMultiple,RadioSelect,MultiWidget,SplitDateTimeWidgetиSelectDateWidget.
- use_required_attribute(initial)¶
Учитывая
начальное'' значение поля формы, возвращает, может ли виджет быть отображен с ``requiredHTML-атрибутом. Формы используют этот метод вместе сField.requiredиForm.use_required_attribute, чтобы определить, следует ли отображать атрибутrequiredдля каждого поля.По умолчанию возвращает False для скрытых виджетов и True в противном случае. Особыми случаями являются
FileInputиClearableFileInput, которые возвращаютFalse, когда установленinitial, иCheckboxSelectMultiple, который всегда возвращаетFalse, поскольку проверка браузера потребует проверки всех флажков, а не хотя бы один.Переопределите этот метод в пользовательских виджетах, которые несовместимы с проверкой браузера. Например, виджет текстового редактора WSYSIWG, поддерживаемый скрытым элементом textarea, может всегда возвращать False, чтобы избежать проверки браузером скрытого поля.
SelectDateWidget¶
- 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в каждом подвиджете. В этом случае для каждой пары «(ключ, виджет)» ключ будет добавлен к «имени» виджета для генерации значения атрибута. Вы можете предоставить пустую строку ('') для одного ключа, чтобы подавить суффикс для одного виджета. Например:>>> 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)¶
В дополнение к ключу
'widget', описанному вWidget.get_context(),MultiWidgetдобавляет ключ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на значение дня, месяца и года для каждого виджета. Следует отметить, что метод обрабатывает случай, когдаvalueравноNone.Стандартная реализация метода
value_from_datadict()возвращает список значений для каждогоWidget. Это полезно при использованииMultiWidgetсовместно сMultiValueField, но так как мы желаем использовать этот виджет совместно сDateField, который принимает единственное значение, мы переопределили этот метод для соединения данных всех подчинённых виджетов вdatetime.date. Метод получает данные из словаряPOST, создаёт и проверяет дату. Если она проходит проверку, мы возвращаем строку, в противном случае возвращаем пустую строку, что заставляетform.is_validвернутьFalse.
Встроенные виджеты¶
Django с помощью модуля django.forms.widgets обеспечивает представление для всех базовых HTML виджетов, а также некоторые часто используемые группы виджетов, включая виджеты для ввода текста, различные чекбоксы и селекторы, загрузку файлов и обработку сложных значений.
Виджеты для ввода текста¶
Эти виджеты используют HTML элементы input и textarea.
TextInput¶
- class TextInput¶
input_type:'текст'имя_шаблона:'django/forms/widgets/text.html'Ввод текста:
<input type="text" ...>
NumberInput¶
EmailInput¶
- class EmailInput¶
input_type:'электронная почта'имя_шаблона:'django/forms/widgets/email.html'Ввод текста:
<input type="email" ...>
URLInput¶
- class URLInput¶
input_type:'url'имя_шаблона:'django/forms/widgets/url.html'Ввод текста:
<input type="url" ...>
КолорИнпут¶
- class ColorInput¶
input_type:'цвет'template_name:'django/forms/widgets/color.html'Отображается как:
<input type="color" ...>
ПоискВвод¶
- class SearchInput¶
input_type:'поиск'имя_шаблона:'django/forms/widgets/search.html'Отображается как:
<input type="search" ...>
ТелИнпут¶
- class TelInput¶
input_type:'тел'template_name:'django/forms/widgets/tel.html'Отображается как:
<input type="tel" ...>
Браузеры по умолчанию не выполняют проверку на стороне клиента, поскольку форматы телефонных номеров сильно различаются по всему миру. Вы можете добавить их, установив
pattern,minlengthилиmaxlengthв аргументеWidget.attrs.Кроме того, вы можете добавить проверку на стороне сервера в поле формы с помощью валидатора, например
RegexValidator, или с помощью сторонних пакетов, таких как django-phonenumber-field.
PasswordInput¶
DateInput¶
- class DateInput¶
input_type:'текст'имя_шаблона:'django/forms/widgets/date.html'Ввод текста:
<input type="text" ...>
Принимает аргументы, аналогичные
TextInput, лишь с одним необязательным аргументом:- format¶
Формат, в котором отображается начальное значение поля.
Если аргумент
formatне указан, форматом по умолчанию является первый формат, найденный вDATE_INPUT_FORMATSи соответствующий Формат локализации. Форматы%U,%Wи%jне поддерживаются этим виджетом.
DateTimeInput¶
- class DateTimeInput¶
input_type:'текст'имя_шаблона:'django/forms/widgets/datetime.html'Ввод текста:
<input type="text" ...>
Принимает аргументы, аналогичные
TextInput, лишь с одним необязательным аргументом:- format¶
Формат, в котором отображается начальное значение поля.
Если аргумент
formatне указан, форматом по умолчанию является первый формат, найденный вDATETIME_INPUT_FORMATSи учитывающий Формат локализации. Форматы%U,%Wи%jне поддерживаются этим виджетом.По умолчанию микросекунды значения всегда устанавливаются в
0. Если микросекунды необходимы, наследуйтесь от этого класса и установите атрибутsupports_microsecondsвTrue.
TimeInput¶
- class TimeInput¶
input_type:'текст'имя_шаблона:'django/forms/widgets/time.html'Ввод текста:
<input type="text" ...>
Принимает аргументы, аналогичные
TextInput, лишь с одним необязательным аргументом:- format¶
Формат, в котором отображается начальное значение поля.
Если аргумент
formatне предоставлен, то стандартный формат берется изTIME_INPUT_FORMATSс учетом format-localization.Подробности об обработке микросекунд смотрите в описании
DateTimeInput.
Textarea¶
- class Textarea¶
template_name:'django/forms/widgets/textarea.html'Текстовая область:
<textarea>...</textarea>
Виджеты выбора и отметки¶
Эти виджеты используют HTML элементы input и textarea.
Виджеты, отображающие несколько вариантов выбора, имеют атрибут option_template_name, который определяет шаблон, используемый для отображения каждого выбора. Например, для виджета Select, select_option.html отображает <option> для <select>.
CheckboxInput¶
- class CheckboxInput¶
Чекбокс:
<input type='checkbox' ...>имя_шаблона:'django/forms/widgets/checkbox.html'Чекбокс:
<input type='checkbox' ...>
Принимает один необязательный аргумент:
- check_test¶
Функция, которая принимает значение
CheckboxInputи возвращаетTrue, если указанное значение было отмечено на элементе.
Select¶
- class Select¶
имя_шаблона:'django/forms/widgets/select.html'option_template_name:'django/forms/widgets/select_option.html'Виджет выбора:
<select><option ...>...</select>
NullBooleanSelect¶
- class NullBooleanSelect¶
имя_шаблона:'django/forms/widgets/select.html'option_template_name:'django/forms/widgets/select_option.html'
Виджет выбора с вариантами „Неизвестно“, „Да“ и „Нет“.
SelectMultiple¶
RadioSelect¶
- class RadioSelect¶
имя_шаблона:'django/forms/widgets/radio.html'option_template_name:'django/forms/widgets/radio_option.html'
Аналогично
Select, но отображается в виде списка переключателей внутри тегов<div>:<div> <div><input type="radio" name="..."></div> ... </div>
Для более тонкого управления процессом генерации HTML кода, вы можете выводить радио кнопки в шаблон в цикле. Рассмотрим форму
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>
Если вы решите не перебирать переключатели — например, если ваш шаблон включает
{{ myform.beatles }}– они будут выведены в<div>с тегами<div>, как указано выше.Внешний контейнер
<div>получает атрибутidвиджета, если он определен, илиBoundField.auto_idв противном случае.При генерации радио кнопок теги
labelandinputсодержат атрибутыforиidсоответственно. Каждая радио кнопка использует атрибутid_for_labelдля генерации ID элемента.
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>
Внешний контейнер
<div>получает атрибутidвиджета, если он определен, илиBoundField.auto_idв противном случае.
Как и RadioSelect, вы можете перебирать отдельные флажки для выбора виджета. В отличие от RadioSelect, флажки не будут включать атрибут required HTML, если поле является обязательным, поскольку проверка браузера потребует проверки всех флажков вместо хотя бы одного.
При генерации чекбоксов теги label and input содержат атрибуты for и id соответственно. Каждый чекбокс использует атрибут id_for_label для генерации ID элемента.
Виджеты для загрузки файлов¶
FileInput¶
- class FileInput¶
имя_шаблона:'django/forms/widgets/file.html'Загрузка файла:
<input type='file' ...>
ClearableFileInput¶
- class ClearableFileInput¶
имя_шаблона:'django/forms/widgets/clearable_file_input.html'Загрузка файла:
<input type='file' ...>, с дополнительным чекбоксом для очистки значения поля, если оно не является обязательным и имеет начальные данные.
Сложные виджеты¶
SplitDateTimeWidget¶
- class SplitDateTimeWidget¶
template_name:'django/forms/widgets/splitdatetime.html'
Обёртка (
MultiWidgetс помощью) вокруг двух виджетов:DateInputдля даты иTimeInputдля времени.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¶
Необязательный список/кортеж с вариантами года. По умолчанию содержит текущий год и девять последующих.
- 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. Если указана строка, каждый<select>будет содержать пустое значение. Еслиempty_labelсодержитlistилиtupleиз 3-х строк – для каждого<select>будет использоваться свое значение. Элементы используются в следующем порядке:('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"), ), )