Виджеты

Виджет - это представление Django элемента ввода HTML. Виджет обрабатывает отображение HTML и извлечение данных из словаря GET / POST, который соответствует виджету.

HTML, созданный встроенными виджетами, использует синтаксис HTML5, таргетинг . Например, он использует логические атрибуты, такие как, а не стиль XHTML .<!DOCTYPE html>checkedchecked='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виджет использует представление <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виджеты будут одинаково отображаться на ваших веб-страницах.

Есть два способа настройки виджетов: для каждого экземпляра виджета и для каждого класса виджета .

Стилизация экземпляров виджета

Если вы хотите, чтобы один экземпляр виджета отличался от другого, вам нужно будет указать дополнительные атрибуты во время создания экземпляра объекта виджета и его назначения полю формы (и, возможно, добавить некоторые правила в ваши файлы 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

classWidget ( 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 не гарантируется, что это допустимый ввод, поэтому реализации подкласса должны программироваться в защитном порядке.

get_context( имя , значение , атрибуты )

Возвращает словарь значений для использования при рендеринге шаблона виджета. По умолчанию словарь содержит единственный ключ, '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>заданным идентификатором поля. Возвращает, Noneесли идентификатор недоступен.

Этот хук необходим, потому что некоторые виджеты имеют несколько элементов HTML и, следовательно, несколько идентификаторов. В этом случае этот метод должен возвращать значение идентификатора, соответствующее первому идентификатору в тегах виджета.

render( имя , значение , attrs = None , renderer = None )

Визуализирует виджет в HTML с использованием данного средства визуализации. Если rendererесть None, используется средство визуализации из FORM_RENDERERнастройки.

value_from_datadict( данные , файлы , имя )

Учитывая словарь данных и имя этого виджета, возвращает значение этого виджета. filesможет содержать данные, поступающие из request.FILES. Возвращает, None если значение не было предоставлено. Также обратите внимание, что value_from_datadictво время обработки данных формы может вызываться более одного раза, поэтому, если вы настроите его и добавите дорогостоящую обработку, вам следует реализовать некоторый механизм кэширования самостоятельно.

value_omitted_from_data( данные , файлы , имя )

Дано dataи filesсловари и имя этого виджета, возвращает информацию о том, есть ли данные или файлы для виджета.

Результат метода влияет на то, возвращается ли поле в форме модели к своему значению по умолчанию .

Особые случаи CheckboxInput, CheckboxSelectMultipleи SelectMultiple, которые всегда возвращаются , Falseпотому что неконтролируемый флажок и невыбранный не отображается в данных о качестве представления HTML формы, так что неизвестно , представляется ли или нет пользователя значения.<select multiple>

use_required_attribute( начальная )

По заданному initialзначению поля формы возвращает, можно ли отобразить виджет с requiredатрибутом HTML. Формы используют этот метод вместе с Field.requiredи, Form.use_required_attributeчтобы определить, отображать ли requiredатрибут для каждого поля.

По умолчанию возвращается Falseдля скрытых виджетов и в True противном случае. Особые случаи - это FileInputи ClearableFileInput, которые возвращаются, Falseкогда initialустановлено, и CheckboxSelectMultiple, которое всегда возвращается, Falseпотому что проверка браузера потребовала бы, чтобы были отмечены все флажки, а не хотя бы один.

Переопределите этот метод в пользовательских виджетах, несовместимых с проверкой браузера. Например, виджет текстового редактора WSYSIWG, поддерживаемый скрытым textareaэлементом, может захотеть всегда возвращаться, Falseчтобы избежать проверки браузером скрытого поля.

Изменено в Django 3.1:

В более старых версиях Trueвозвращалось, FileInputкогда initialбыло установлено.

MultiWidget

classMultiWidget ( 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( значение )

Этот метод берет одно «сжатое» значение из поля и возвращает список «распакованных» значений. Входное значение можно считать действительным, но не обязательно непустым.

Этот метод должен быть реализован подклассом, и поскольку значение может быть пустым, реализация должна быть защитной.

Обоснование «декомпрессии» состоит в том, что необходимо «разбить» объединенное значение поля формы на значения для каждого виджета.

Примером этого является то, как 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( имя , значение , атрибуты )

В дополнение к 'widget'ключу, описанному в Widget.get_context(), MultiWidgetдобавляет widget['subwidgets']ключ.

Их можно перебрать в шаблоне виджета:

{% for subwidget in widget.subwidgets %}
    {% include subwidget.template_name with widget=subwidget %}
{% endfor %}

Вот пример виджета, подклассы которого MultiWidgetдля отображения даты с днем, месяцем и годом в разных полях выбора. Этот виджет предназначен для использования с a, DateFieldа не с a 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. Но поскольку мы хотим использовать этот виджет с a DateField, который принимает одно значение, мы переопределили этот метод. Реализация здесь объединяет данные из подвиджетов в строку в ожидаемом формате DateField.

Встроенные виджеты

Django предоставляет представление всех основных виджетов HTML, а также некоторых часто используемых групп виджетов в django.forms.widgetsмодуле, включая ввод текста , различные флажки и селекторы , загрузку файлов и обработку многозначного ввода .

Виджеты, обрабатывающие ввод текста

Эти виджеты используют элементы HTML inputи textarea.

TextInput

класс TextInput
  • input_type: 'text'
  • template_name: 'django/forms/widgets/text.html'
  • Отображается как: <input type="text" ...>

NumberInput

класс NumberInput
  • input_type: 'number'
  • template_name: 'django/forms/widgets/number.html'
  • Отображается как: <input type="number" ...>

Помните, что не все браузеры поддерживают ввод локализованных чисел в numberтипы ввода. Сам Django избегает их использования для полей, для которых localizeустановлено свойство True.

EmailInput

класс EmailInput
  • input_type: 'email'
  • template_name: 'django/forms/widgets/email.html'
  • Отображается как: <input type="email" ...>

URLInput

класс URLInput
  • input_type: 'url'
  • template_name: 'django/forms/widgets/url.html'
  • Отображается как: <input type="url" ...>

PasswordInput

класс PasswordInput
  • input_type: 'password'
  • template_name: 'django/forms/widgets/password.html'
  • Отображается как: <input type="password" ...>

Принимает один необязательный аргумент:

render_value

Определяет, будет ли виджет иметь заполненное значение при повторном отображении формы после ошибки проверки (по умолчанию False).

HiddenInput

класс HiddenInput
  • input_type: 'hidden'
  • template_name: 'django/forms/widgets/hidden.html'
  • Отображается как: <input type="hidden" ...>

Обратите внимание, что также есть MultipleHiddenInputвиджет, который инкапсулирует набор скрытых элементов ввода.

DateInput

класс DateInput
  • input_type: 'text'
  • template_name: 'django/forms/widgets/date.html'
  • Отображается как: <input type="text" ...>

Принимает те же аргументы, что и TextInput, с еще одним необязательным аргументом:

format

Формат, в котором будет отображаться начальное значение этого поля.

Если ни один formatаргумент не предусмотрен формат по умолчанию является первым форматом найден в DATE_INPUT_FORMATSи отношениях локализации Формата .

DateTimeInput

класс 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

класс TimeInput
  • input_type: 'text'
  • template_name: 'django/forms/widgets/time.html'
  • Отображается как: <input type="text" ...>

Принимает те же аргументы, что и TextInput, с еще одним необязательным аргументом:

format

Формат, в котором будет отображаться начальное значение этого поля.

Если ни один formatаргумент не предусмотрен формат по умолчанию является первым форматом найден в TIME_INPUT_FORMATSи отношениях локализации Формата .

Об обработке микросекунд см DateTimeInput.

Textarea

класс 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

класс CheckboxInput
  • input_type: 'checkbox'
  • template_name: 'django/forms/widgets/checkbox.html'
  • Отображается как: <input type="checkbox" ...>

Принимает один необязательный аргумент:

check_test

Вызываемый объект, который принимает значение CheckboxInputи возвращает, Trueесли флажок должен быть установлен для этого значения.

Select

класс Select
  • template_name: 'django/forms/widgets/select.html'
  • option_template_name: 'django/forms/widgets/select_option.html'
  • Отображается как: <select><option ...>...</select>
choices

Этот атрибут является необязательным, если поле формы не имеет choicesатрибута. Если это так, он переопределит все, что вы здесь установили, когда атрибут будет обновлен в Field.

NullBooleanSelect

класс NullBooleanSelect
  • template_name: 'django/forms/widgets/select.html'
  • option_template_name: 'django/forms/widgets/select_option.html'

Выберите виджет с вариантами «Неизвестно», «Да» и «Нет».

SelectMultiple

класс SelectMultiple
  • template_name: 'django/forms/widgets/select.html'
  • option_template_name: 'django/forms/widgets/select_option.html'

Аналогично Select, но допускает множественный выбор: <select multiple>...</select>

RadioSelect

класс RadioSelect
  • template_name: 'django/forms/widgets/radio.html'
  • option_template_name: 'django/forms/widgets/radio_option.html'

Аналогично Select, но отображается в виде списка переключателей внутри <li>тегов:

<ul>
  <li><input type="radio" name="..."></li>
  ...
</ul>

Для более детального управления сгенерированной разметкой вы можете перебирать переключатели в шаблоне. Предположим, что форма myformс полем beatlesиспользует в RadioSelectкачестве виджета:

{% for radio in myform.beatles %}
<div class="myradio">
    {{ radio }}
</div>
{% endfor %}

Это сгенерирует следующий HTML:

<div class="myradio">
    <label for="id_beatles_0"><input id="id_beatles_0" name="beatles" type="radio" value="john" required> John</label>
</div>
<div class="myradio">
    <label for="id_beatles_1"><input id="id_beatles_1" name="beatles" type="radio" value="paul" required> Paul</label>
</div>
<div class="myradio">
    <label for="id_beatles_2"><input id="id_beatles_2" name="beatles" type="radio" value="george" required> George</label>
</div>
<div class="myradio">
    <label for="id_beatles_3"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" required> Ringo</label>
</div>

Это включало <label>теги. Чтобы получить более зернистая, вы можете использовать для каждой кнопки радиостанции tag, choice_labelи id_for_labelатрибуты. Например, этот шаблон…

{% for radio in myform.beatles %}
    <label for="{{ radio.id_for_label }}">
        {{ radio.choice_label }}
        <span class="radio">{{ radio.tag }}</span>
    </label>
{% endfor %}

… Приведет к следующему HTML:

<label for="id_beatles_0">
    John
    <span class="radio"><input id="id_beatles_0" name="beatles" type="radio" value="john" required></span>
</label>

<label for="id_beatles_1">
    Paul
    <span class="radio"><input id="id_beatles_1" name="beatles" type="radio" value="paul" required></span>
</label>

<label for="id_beatles_2">
    George
    <span class="radio"><input id="id_beatles_2" name="beatles" type="radio" value="george" required></span>
</label>

<label for="id_beatles_3">
    Ringo
    <span class="radio"><input id="id_beatles_3" name="beatles" type="radio" value="ringo" required></span>
</label>

Если вы решите не перебирать переключатели - например, если ваш шаблон включает - они будут выведены в тегах with , как указано выше.{{ myform.beatles }}<ul><li>

Внешний <ul>контейнер получает idатрибут виджета, если он определен, или BoundField.auto_idиначе.

Когда цикл по радио кнопки, то labelи inputтеги включают forи idатрибуты, соответственно. У каждой радиокнопки есть id_for_labelатрибут для вывода идентификатора элемента.

CheckboxSelectMultiple

класс CheckboxSelectMultiple
  • template_name: 'django/forms/widgets/checkbox_select.html'
  • option_template_name: 'django/forms/widgets/checkbox_option.html'

Аналогично SelectMultiple, но отображается в виде списка флажков:

<ul>
  <li><input type="checkbox" name="..." ></li>
  ...
</ul>

Внешний <ul>контейнер получает idатрибут виджета, если он определен, или BoundField.auto_idиначе.

Например RadioSelect, вы можете перебирать отдельные флажки для выбора виджета. В отличие от этого RadioSelect, флажки не будут включать requiredатрибут HTML, если поле является обязательным, потому что проверка браузера потребует проверки всех флажков, а не хотя бы одного.

Когда цикл над флажками, то labelи inputтеги включают forи idатрибуты, соответственно. У каждого флажка есть id_for_labelатрибут для вывода идентификатора элемента.

Виджеты загрузки файлов

FileInput

класс FileInput
  • template_name: 'django/forms/widgets/file.html'
  • Отображается как: <input type="file" ...>

ClearableFileInput

класс ClearableFileInput
  • template_name: 'django/forms/widgets/clearable_file_input.html'
  • Отображается как: с дополнительным вводом флажка для очистки значения поля, если поле не является обязательным и имеет исходные данные.<input type="file" ...>

Составные виджеты

MultipleHiddenInput

класс MultipleHiddenInput
  • template_name: 'django/forms/widgets/multiple_hidden.html'
  • Отображает как: несколько тегов<input type="hidden" ...>

Виджет, который обрабатывает несколько скрытых виджетов для полей со списком значений.

SplitDateTimeWidget

класс 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

класс SplitHiddenDateTimeWidget
  • template_name: 'django/forms/widgets/splithiddendatetime.html'

Аналогично SplitDateTimeWidget, но используется HiddenInputкак для даты, так и для времени.

SelectDateWidget

класс SelectDateWidget
  • template_name: 'django/forms/widgets/select_date.html'

Обертка вокруг трех Selectвиджетов: по одному для месяца, дня и года.

Принимает несколько необязательных аргументов:

years

Необязательный список / кортеж лет для использования в поле выбора «год». По умолчанию это список, содержащий текущий год и следующие 9 лет.

months

Необязательный указатель месяцев для использования в поле выбора «месяцы».

Клавиши dict соответствуют номеру месяца (с индексом 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или tuple3 строковых элемента, поля выбора будут иметь свою собственную метку. Этикетки должны быть в таком порядке .('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"),
    ),
)

Copyright ©2021 All rights reserved