Виджеты¶
Виджет - это представление Django элемента ввода HTML. Виджет обрабатывает рендеринг HTML и извлечение данных из GET/POST словаря, соответствующего виджету.
HTML, создаваемый встроенными виджетами, использует синтаксис HTML5, ориентированный на <!DOCTYPE html>. Например, он использует булевы атрибуты, такие как checked, а не стиль XHTML checked='checked'.
Совет
Виджеты не следует путать с form fields. Поля формы имеют дело с логикой валидации ввода и используются непосредственно в шаблонах. Виджеты имеют дело с визуализацией элементов ввода HTML-формы на веб-странице и извлечением необработанных отправленных данных. Тем не менее, виджеты должны быть assigned к полям форм.
Указание виджетов¶
Всякий раз, когда вы указываете поле в форме, Django будет использовать виджет по умолчанию, соответствующий типу отображаемых данных. Чтобы узнать, какой виджет используется для того или иного поля, смотрите документацию о Встроенные классы Field.
Однако, если вы хотите использовать другой виджет для поля, вы можете использовать аргумент widget в определении поля. Например:
from django import forms
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField(widget=forms.Textarea)
Это укажет форму с комментарием, которая использует больший виджет Textarea, а не виджет по умолчанию TextInput.
Установка аргументов для виджетов¶
Многие виджеты имеют необязательные дополнительные аргументы; их можно установить при определении виджета на поле. В следующем примере атрибут years установлен для SelectDateWidget:
from django import forms
BIRTH_YEAR_CHOICES = ["1980", "1981", "1982"]
FAVORITE_COLORS_CHOICES = {
"blue": "Blue",
"green": "Green",
"black": "Black",
}
class SimpleForm(forms.Form):
birth_year = forms.DateField(
widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES)
)
favorite_colors = forms.MultipleChoiceField(
required=False,
widget=forms.CheckboxSelectMultiple,
choices=FAVORITE_COLORS_CHOICES,
)
Смотрите Встроенные виджеты для получения дополнительной информации о том, какие виджеты доступны и какие аргументы они принимают.
Виджеты, наследующие от виджета Select¶
Виджеты, наследующие виджет Select, имеют дело с выбором. Они представляют пользователю список опций, из которых можно выбирать. Различные виджеты представляют этот выбор по-разному; сам виджет Select использует представление списка <select> HTML, а RadioSelect использует радиокнопки.
<<<Виджеты Select по умолчанию используются для полей ChoiceField. Варианты выбора, отображаемые на виджете, наследуются от ChoiceField, и изменение ChoiceField.choices приведет к обновлению Select.choices. Например:
>>> from django import forms
>>> CHOICES = {"1": "First", "2": "Second"}
>>> choice_field = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICES)
>>> choice_field.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices = []
>>> choice_field.choices = [("1", "First and only")]
>>> choice_field.widget.choices
[('1', 'First and only')]
Виджеты, предлагающие атрибут choices, могут использоваться с полями, не основанными на выборе - например, CharField - но рекомендуется использовать поле, основанное на ChoiceField, когда выбор присущ модели, а не только представляющему виджету.
Настройка экземпляров виджетов¶
Когда Django отображает виджет как HTML, он отображает только очень минимальную разметку - Django не добавляет имена классов или любые другие специфические для виджета атрибуты. Это означает, что, например, все виджеты TextInput будут выглядеть одинаково на ваших веб-страницах.
Существует два способа настройки виджетов: per widget instance и per widget class.
Стилизация экземпляров виджетов¶
Если вы хотите, чтобы один экземпляр виджета отличался от другого, вам нужно будет указать дополнительные атрибуты в момент инстанцирования объекта виджета и назначения его полю формы (и, возможно, добавить некоторые правила в ваши 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 включит дополнительные атрибуты в отображаемый вывод:
>>> 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) и более глубоко настраивать их внешний вид и поведение.
В двух словах, вам нужно будет создать подкласс виджета и либо define a «Media» inner class, либо create a «media» property.
Эти методы предполагают несколько продвинутое программирование на Python и подробно описаны в руководстве по теме Form Assets.
Базовые классы виджетов¶
Базовые классы виджетов Widget и MultiWidget являются подклассами всех built-in widgets и могут служить основой для пользовательских виджетов.
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 поля. Возвращает пустую строку, если 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и имя этого виджета, возвращает наличие или отсутствие данных или файлов для виджета.Результат метода влияет на то, является ли поле в форме модели falls back to its default.
Особыми случаями являются
CheckboxInput,CheckboxSelectMultipleиSelectMultiple, которые всегда возвращаютFalse, потому что не установленный флажок и не выбранный<select multiple>не появляются в данных отправки HTML-формы, поэтому неизвестно, отправил пользователь значение или нет.
-
use_fieldset¶ Атрибут, определяющий, должен ли виджет быть сгруппирован в
<fieldset>с<legend>при отображении. По умолчанию имеет значениеFalse, но может бытьTrue, если виджет содержит несколько тегов<input>, таких какCheckboxSelectMultiple,RadioSelect,MultiWidget,SplitDateTimeWidgetиSelectDateWidget.
-
use_required_attribute(initial)¶ Учитывая значение
initialполя формы, возвращает, может ли виджет быть отображен с атрибутомrequiredHTML. Формы используют этот метод вместе сField.requiredиForm.use_required_attribute, чтобы определить, отображать или нет атрибутrequiredдля каждого поля.По умолчанию возвращает
Falseдля скрытых виджетов иTrueв противном случае. Особыми случаями являютсяFileInputиClearableFileInput, которые возвращаютFalse, когда установленоinitial, иCheckboxSelectMultiple, который всегда возвращаетFalse, поскольку проверка браузера требует, чтобы были установлены все флажки, а не хотя бы один.Переопределите этот метод в пользовательских виджетах, которые не совместимы с проверкой браузера. Например, виджет текстового редактора WSYSIWG, поддерживаемый скрытым элементом
textarea, может захотеть всегда возвращатьFalse, чтобы избежать проверки браузера на скрытое поле.
-
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. Это уместно при использованииMultiWidgetсMultiValueField. Но поскольку мы хотим использовать этот виджет сDateField, который принимает одно значение, мы переопределили этот метод. Реализация здесь объединяет данные из субвиджетов в строку в формате, который ожидаетDateField.-
Встроенные виджеты¶
Django предоставляет представление всех основных виджетов HTML, плюс некоторые часто используемые группы виджетов в модуле django.forms.widgets, включая the input of text, various checkboxes and selectors, uploading files и handling of multi-valued input.
Виджеты, обрабатывающие ввод текста¶
Эти виджеты используют элементы 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" ...>
ColorInput¶
-
class
ColorInput¶ input_type:'color'template_name:'django/forms/widgets/color.html'- Отображается как:
<input type="color" ...>
SearchInput¶
-
class
SearchInput¶ input_type:'search'template_name:'django/forms/widgets/search.html'- Отображается как:
<input type="search" ...>
TelInput¶
-
class
TelInput¶ input_type:'tel'template_name:'django/forms/widgets/tel.html'- Отображается как:
<input type="tel" ...>
Браузеры по умолчанию не выполняют проверку на стороне клиента, поскольку форматы телефонных номеров сильно различаются по всему миру. Вы можете добавить некоторые из них, указав
pattern,minlength, илиmaxlengthв аргументеWidget.attrs.Кроме того, вы можете добавить проверку на стороне сервера в поле формы с помощью средства проверки, такого как
RegexValidator, или с помощью сторонних пакетов, таких как django-phonenumber-field.
PasswordInput¶
-
class
PasswordInput¶ input_type:'password'template_name:'django/forms/widgets/password.html'- Изображается как:
<input type="password" ...>
Принимает один необязательный аргумент:
-
render_value¶ Определяет, будет ли у виджета заполнено значение при повторном отображении формы после ошибки валидации (по умолчанию
False).
DateInput¶
-
class
DateInput¶ input_type:'text'template_name:'django/forms/widgets/date.html'- Изображается как:
<input type="text" ...>
Принимает те же аргументы, что и
TextInput, с еще одним необязательным аргументом:-
format¶ Формат, в котором будет отображаться начальное значение этого поля.
Если аргумент
formatне указан, форматом по умолчанию будет первый формат, найденный вDATE_INPUT_FORMATSи соответствующий Локализация формата. Форматы%U,%Wи%jэтим виджетом не поддерживаются.
DateTimeInput¶
-
class
DateTimeInput¶ input_type:'text'template_name:'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:'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¶
-
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>
NullBooleanSelect¶
-
class
NullBooleanSelect¶ template_name:'django/forms/widgets/select.html'option_template_name:'django/forms/widgets/select_option.html'
Выберите виджет с опциями „Неизвестно“, „Да“ и „Нет“
SelectMultiple¶
RadioSelect¶
-
class
RadioSelect¶ template_name:'django/forms/widgets/radio.html'option_template_name:'django/forms/widgets/radio_option.html'
Аналогичен
Select, но отображается как список радиокнопок в тегах<div>:<div> <div><input type="radio" name="..."></div> ... </div>
Для более детального контроля над генерируемой разметкой вы можете перебирать радиокнопки в шаблоне. Предположим форму
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в противном случае.При переходе по радиокнопкам теги
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, но отображается как список флажков:<div> <div><input type="checkbox" name="..." ></div> ... </div>
Внешний контейнер
<div>получает атрибутidвиджета, если он определен, илиBoundField.auto_idв противном случае.
Как и RadioSelect, вы можете перебирать отдельные флажки для выбора вариантов виджета. В отличие от RadioSelect, флажки не будут включать HTML-атрибут required, если поле является обязательным, поскольку проверка браузера потребует, чтобы все флажки были отмечены, а не хотя бы один.
При переборе флажков теги label и input включают атрибуты for и id соответственно. Каждый флажок имеет атрибут id_for_label для вывода ID элемента.
Виджеты загрузки файлов¶
Составные виджеты¶
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.
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из трех строковых элементов, то поля выбора будут иметь свою собственную пользовательскую метку. Метки должны располагаться в таком порядке('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"), ), )