Виджеты
Виджет — это представление 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) -
Этот абстрактный класс не может быть отображен, но предоставляет базовый атрибут
attrs. Вы также можете реализовать или переопределить методrender()в пользовательских виджетах.-
attrs -
Словарь, содержащий атрибуты HTML, которые нужно установить для отрисованного виджета.
>>> from django import forms >>> name = forms.TextInput(attrs={'size': 10, 'title': 'Your name'}) >>> name.render('name', 'A name') '<input title="Your name" type="text" name="name" value="A name" size="10">'Если вы присвоите значение
TrueилиFalseатрибуту, оно будет отображено как булевый атрибут HTML5:>>> name = forms.TextInput(attrs={'required': True}) >>> name.render('name', 'A name') '<input name="name" type="text" value="A name" required>' >>> >>> name = forms.TextInput(attrs={'required': False}) >>> name.render('name', 'A name') '<input name="name" type="text" value="A name">'
-
supports_microseconds -
Атрибут, который по умолчанию равен
True. Если он установлен вFalse, часть микросекунд значенийdatetimeиtimeбудут установлены в0.
-
format_value(value) -
Очищает и возвращает значение для использования в шаблоне виджета.
valueне гарантируется, что будет допустимым вводом, поэтому реализации подклассов должны действовать предосторожно.
-
get_context(name, value, attrs) -
Возвращает словарь значений для использования при отрисовке шаблона виджета. По умолчанию словарь содержит единственный ключ,
'widget', который представляет собой словарь представления виджета, содержащий следующие ключи:-
'name': Имя поля из аргументаname. -
'is_hidden': Логическое значение, указывающее, скрыт ли данный виджет. -
'required': Логическое значение, указывающее, является ли поле для данного виджета обязательным. -
'value': Значение, возвращенное функциейformat_value(). -
'attrs': Атрибуты HTML, которые должны быть установлены для отрисованного виджета. Сочетание атрибутаattrsи аргументаattrs. -
'template_name': Значениеself.template_name.
Подклассы
Widgetмогут предоставлять пользовательские значения контекста, переопределяя этот метод. -
-
id_for_label(id_) -
Возвращает атрибут HTML ID этого виджета для использования
<label>, учитывая ID поля. ВозвращаетNoneесли ID недоступен.Этот метод необходим, потому что некоторые виджеты имеют несколько элементов HTML и, следовательно, несколько ID. В этом случае этот метод должен возвращать значение ID, соответствующее первому ID в тегах виджета.
-
render(name, value, attrs=None, renderer=None) -
Отображает виджет в HTML с помощью заданного рендерера. Если
rendererимеет значениеNone, используется рендерер из настройкиFORM_RENDERER.
-
value_from_datadict(data, files, name) -
Учитывая словарь данных и имя этого виджета, возвращает значение этого виджета.
filesможет содержать данные, полученные изrequest.FILES. ВозвращаетNoneесли значение не было предоставлено. Обратите также внимание, чтоvalue_from_datadictможет вызываться более одного раза во время обработки данных формы, поэтому, если вы его настраиваете и добавляете дорогостоящую обработку, вам следует самостоятельно реализовать механизм кэширования.
-
value_omitted_from_data(data, files, name) -
Учитывая словари
dataиfilesи имя этого виджета, возвращает, есть ли данные или файлы для виджета.Результат метода влияет на то, будет ли поле в форме модели возвращено к своему значению по умолчанию.
Особые случаи:
CheckboxInput,CheckboxSelectMultipleиSelectMultiple, которые всегда возвращаютFalse, потому что не отмеченный флажок и не выбранный<select multiple>не отображаются в данных отправки HTML-формы, поэтому неизвестно, отправил ли пользователь значение.
-
use_required_attribute(initial) -
Учитывая значение
initialполя формы, возвращает, может ли виджет быть отображен с атрибутом HTMLrequired. Формы используют этот метод вместе сField.requiredиForm.use_required_attributeдля определения того, отображать ли атрибутrequiredдля каждого поля.По умолчанию возвращает
Falseдля скрытых виджетов иTrueв противном случае. Особые случаи:FileInputиClearableFileInput, которые возвращаютFalseпри установкеinitial, иCheckboxSelectMultiple, который всегда возвращаетFalse, потому что проверка браузера потребовала бы проверки всех флажков вместо хотя бы одного.Переопределите этот метод в пользовательских виджетах, которые несовместимы с проверкой браузера. Например, виджет WYSIWYG-редактора текста, поддерживаемый скрытым элементом
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(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на значения дня, месяца и года, соответствующие каждому виджету. Если была выбрана некорректная дата, например, 30 февраля,DateFieldпередаёт в этот метод строку, которую нужно разобрать. Конечныйreturnобрабатывает случай, когдаvalueявляетсяNone, что означает, что у нас нет значений по умолчанию для подвиджетов.По умолчанию
value_from_datadict()возвращает список значений, соответствующих каждомуWidget. Это подходит при использовании сMultiValueField. Но поскольку мы хотим использовать этот виджет сDateField, который принимает одно значение, мы переопределили этот метод. Реализация здесь объединяет данные из подвиджетов в строку в формате, ожидаемомDateField. -
Встроенные виджеты
Django предоставляет представление всех основных HTML-виджетов, а также некоторые часто используемые группы виджетов в модуле django.forms.widgets, включая виджеты для ввода текста, различные флажки и выпадающие списки, загрузку файлов и обработку многозначного ввода.
Виджеты для ввода текста
Эти виджеты используют HTML-элементы input и textarea.
TextInput
-
class TextInput -
-
input_type:'text' -
template_name:'django/forms/widgets/text.html' - Отображается как:
<input type="text" ...>
-
NumberInput
-
class NumberInput -
-
input_type:'number' -
template_name:'django/forms/widgets/number.html' - Отображается как:
<input type="number" ...>
Обратите внимание, что не все браузеры поддерживают ввод локальных чисел в типах ввода
number. Сам Django избегает их использования для полей, у которых свойствоlocalizeустановлено вTrue. -
EmailInput
-
class EmailInput -
-
input_type:'email' -
template_name:'django/forms/widgets/email.html' - Отображается как:
<input type="email" ...>
-
URLInput
-
class URLInput -
-
input_type:'url' -
template_name:'django/forms/widgets/url.html' - Отображается как:
<input type="url" ...>
-
PasswordInput
-
class PasswordInput -
-
input_type:'password' -
template_name:'django/forms/widgets/password.html' - Отображается как:
<input type="password" ...>
Принимает один необязательный аргумент:
-
render_value -
Определяет, будет ли в виджете отображено значение при повторном отображении формы после ошибки валидации (по умолчанию
False).
-
HiddenInput
DateInput
-
class DateInput -
-
input_type:'text' -
template_name:'django/forms/widgets/date.html' - Отображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput, с одним дополнительным необязательным аргументом:-
format -
Формат, в котором будет отображаться начальное значение этого поля.
Если аргумент
formatне указан, используется формат по умолчанию, найденный вDATE_INPUT_FORMATSи учитывающий Локализация форматов. -
DateTimeInput
-
class DateTimeInput -
-
input_type:'text' -
template_name:'django/forms/widgets/datetime.html' - Отображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput, плюс один дополнительный необязательный аргумент:-
format -
Формат отображения начального значения этого поля.
Если аргумент
formatне указан, используется первый формат изDATETIME_INPUT_FORMATSи учитывается Локализация форматов.По умолчанию, микросекундная часть значения времени всегда устанавливается в
0. Если нужны микросекунды, используйте подкласс с атрибутомsupports_microseconds, установленным вTrue. -
TimeInput
-
class TimeInput -
-
input_type:'text' -
template_name:'django/forms/widgets/time.html' - Отображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput, плюс один дополнительный необязательный аргумент:-
format -
Формат отображения начального значения этого поля.
Если аргумент
formatне указан, используется первый формат изTIME_INPUT_FORMATSи учитывается Локализация форматов.Обработка микросекунд описана в
DateTimeInput. -
Textarea
-
class Textarea -
-
template_name:'django/forms/widgets/textarea.html' - Отображается как:
<textarea>...</textarea>
-
Селекторы и чекбоксы
Эти виджеты используют HTML-элементы <select>, <input type="checkbox">, и <input type="radio">.
Виджеты, отображающие несколько вариантов, имеют атрибут option_template_name, указывающий шаблон для отображения каждого варианта. Например, для виджета Select, select_option.html отображает <option> для <select>.
CheckboxInput
-
class CheckboxInput -
-
input_type:'checkbox' -
template_name:'django/forms/widgets/checkbox.html' - Отображается как:
<input type="checkbox" ...>
Принимает один необязательный аргумент:
-
check_test -
Функция, принимающая значение
CheckboxInputи возвращающаяTrue, если чекбокс должен быть отмечен для этого значения.
-
Select
-
class Select -
-
template_name:'django/forms/widgets/select.html' -
option_template_name:'django/forms/widgets/select_option.html' - Отображается как:
<select><option ...>...</select>
-
choices -
Этот атрибут необязателен, если поле формы не имеет атрибута
choices. Если он есть, он переопределит любые значения, заданные здесь, когда атрибут обновляется вField.
-
NullBooleanSelect
-
class NullBooleanSelect -
-
template_name:'django/forms/widgets/select.html' -
option_template_name:'django/forms/widgets/select_option.html'
Виджет селектора с опциями «Неизвестно», «Да» и «Нет»
-
SelectMultiple
-
class SelectMultiple -
-
template_name:'django/forms/widgets/select.html' -
option_template_name:'django/forms/widgets/select_option.html'
Аналогичен
Select, но позволяет множественный выбор:<select multiple>...</select> -
RadioSelect
-
class RadioSelect -
-
template_name:'django/forms/widgets/radio.html' -
option_template_name:'django/forms/widgets/radio_option.html'
Аналогичен
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для вывода идентификатора элемента. -
CheckboxSelectMultiple
-
class 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 для вывода идентификатора элемента.
Виджеты загрузки файлов
FileInput
-
class FileInput -
-
template_name:'django/forms/widgets/file.html' - Отображается как:
<input type="file" ...>
-
ClearableFileInput
-
class ClearableFileInput -
-
template_name:'django/forms/widgets/clearable_file_input.html' - Отображается как:
<input type="file" ...>с дополнительным чекбоксом для очистки значения поля, если поле не является обязательным и имеет начальные данные.
-
Составные виджеты
MultipleHiddenInput
-
class MultipleHiddenInput -
-
template_name:'django/forms/widgets/multiple_hidden.html' - Отображается как: несколько
<input type="hidden" ...>тегов
Виджет, обрабатывающий несколько скрытых виджетов для полей со списком значений.
-
SplitDateTimeWidget
-
class SplitDateTimeWidget -
-
template_name:'django/forms/widgets/splitdatetime.html'
Обёртка (используя
MultiWidget) вокруг двух виджетов:DateInputдля даты иTimeInputдля времени. Должен использоваться сSplitDateTimeField, а не сDateTimeField.SplitDateTimeWidgetимеет несколько необязательных аргументов:-
date_format -
Аналогично
DateInput.format
-
time_format -
Аналогично
TimeInput.format
-
date_attrs
-
time_attrs -
Аналогично
Widget.attrs. Словарь, содержащий HTML-атрибуты, которые должны быть установлены для рендерящихся виджетовDateInputиTimeInputсоответственно. Если эти атрибуты не установлены, используетсяWidget.attrs.
-
SplitHiddenDateTimeWidget
SelectDateWidget
-
class SelectDateWidget -
-
template_name:'django/forms/widgets/select_date.html'
Обёртка вокруг трёх виджетов
Select: один для месяца, один для дня и один для года.Принимает несколько необязательных аргументов:
-
years -
Необязательный список/кортеж годов, которые следует использовать в поле выбора «год». По умолчанию используется список, содержащий текущий год и следующие 9 лет.
-
months -
Необязательный словарь месяцев для использования в поле выбора «месяц».
Ключи словаря соответствуют номеру месяца (индексированному с 1), а значения — отображаемым месяцам:
MONTHS = { 1:_('jan'), 2:_('feb'), 3:_('mar'), 4:_('apr'), 5:_('may'), 6:_('jun'), 7:_('jul'), 8:_('aug'), 9:_('sep'), 10:_('oct'), 11:_('nov'), 12:_('dec') }
-
empty_label -
Если
DateFieldне является обязательным,SelectDateWidgetбудет иметь пустой вариант в начале списка (по умолчанию это---). Можно изменить текст этой метки с помощью атрибутаempty_label.empty_labelможет бытьstring,list, илиtuple. Если используется строка, в каждом поле выбора будет пустой вариант с этой меткой. Еслиempty_labelявляетсяlistилиtupleиз 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/3.2/ref/forms/widgets/