Виджеты
Виджет — это представление 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 поля. Возвращает пустую строку, если 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_fieldset -
Новая функция в Django 4.1.
Атрибут, определяющий, должен ли виджет быть сгруппирован в
<fieldset>с<legend>при отображении. По умолчаниюFalse, но являетсяTrue, когда виджет содержит несколько тегов<input>, таких какCheckboxSelectMultiple,RadioSelect,MultiWidget,SplitDateTimeWidgetиSelectDateWidget.
-
use_required_attribute(initial) -
Учитывая значение
initialполя формы, возвращает, можно ли отобразить виджет с атрибутом HTMLrequired. Формы используют этот метод вместе сField.requiredиForm.use_required_attributeдля определения, отображать ли атрибутrequiredдля каждого поля.По умолчанию возвращает
Falseдля скрытых виджетов иTrueв противном случае. Особые случаи —FileInputиClearableFileInput, которые возвращаютFalseпри установкеinitial, иCheckboxSelectMultiple, который всегда возвращаетFalse, потому что проверка браузера требует, чтобы все флажки были установлены вместо хотя бы одного.Переопределите этот метод в пользовательских виджетах, которые не совместимы с проверкой браузера. Например, виджет WYSIWYG редактора текста, поддерживаемый скрытым элементом
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, включая виджеты для ввода текста, различные флажки и выпадающие списки, загрузку файлов и обработку многозначных данных.
Виджеты для ввода текста
Эти виджеты используют 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, но отображается в виде списка радиокнопок внутри<div>тегов:<div> <div><input type="radio" name="..."></div> ... </div>
Для более точного контроля сгенерированного разметки, можно проходить по радиокнопкам в шаблоне. Предполагая форму
myformс полемbeatles, которое использует виджет %%%CODE_BLOCK_307%%:<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для вывода 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 и input включают атрибуты for и id соответственно. Каждый чекбокс имеет атрибут id_for_label для вывода ID элемента.
Загрузка файлов
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/4.2/ref/forms/widgets/