Виджеты
Виджет — это представление 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-класс. Также можно указать атрибут «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) >>> 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поля формы возвращает, может ли виджет быть отображён с атрибутомrequiredHTML. Формы используют этот метод вместе с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>
Изменено в Django 4.0:Для более четкого объявления для экранных читателей, радиокнопки были переведены на отображение в тегах
<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для вывода 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в противном случае.Изменено в Django 4.0:Для более четкого объявления для экранных читателей, чекбоксы были переведены на отображение в тегах
<div>. -
Как и в RadioSelect, вы можете перебирать отдельные чекбоксы для вариантов виджета. В отличие от RadioSelect, чекбоксы не будут содержать HTML-атрибут required , если поле обязательно, так как браузерная валидация потребует отметки всех чекбоксов, а не хотя бы одного.
При переборе чекбоксов теги 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.0/ref/forms/widgets/