Виджеты¶
Виджет - это представление 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, когда выбор присущ модели, а не только представляющему виджету.
Настройка экземпляров виджетов¶
When Django renders a widget as HTML, it only renders very minimal markup -
Django doesn’t add class names, or any other widget-specific attributes. This
means, for example, that all TextInput widgets will appear the same
on your web pages.
Существует два способа настройки виджетов: 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, с рендерингом по умолчанию - без 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>
On a real web page, you probably don’t want every widget to look the same. You
might want a larger input element for the comment, and you might want the
„name“ widget to have some special CSS class. It is also possible to specify
the „type“ attribute to take advantage of the new HTML5 input types. To do
this, you use the Widget.attrs argument when creating the widget:
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) и более глубоко настраивать их внешний вид и поведение.
В двух словах, вам нужно будет создать подкласс виджета и либо 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_)[исходный код]¶ Returns the HTML ID attribute of this widget for use by a
<label>, given the ID of the field. Returns an empty string if an ID isn’t available.Этот хук необходим, поскольку некоторые виджеты имеют несколько элементов 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¶ - New in Django Development version.
Атрибут, определяющий, должен ли виджет быть сгруппирован в
<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)[исходный код]¶ In addition to the
'widget'key described inWidget.get_context(),MultiWidgetadds awidget['subwidgets']key.Их можно зациклить в шаблоне виджета:
{% 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)
The constructor creates several
Selectwidgets in a list. Thesuper()method uses this list to set up the widget.Необходимый метод
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" ...>
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и соответствующий Локализация формата.
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>
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'
Similar to
Select, but rendered as a list of radio buttons within<div>tags:<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>
If you decide not to loop over the radio buttons – e.g., if your template includes
{{ myform.beatles }}– they’ll be output in a<div>with<div>tags, as above.The outer
<div>container receives theidattribute of the widget, if defined, orBoundField.auto_idotherwise.При переходе по радиокнопкам теги
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>
The outer
<div>container receives theidattribute of the widget, if defined, orBoundField.auto_idotherwise.
Как и 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" ...>с дополнительным вводом флажка для очистки значения поля, если поле не является обязательным и имеет исходные данные.
Составные виджеты¶
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"), ), )