Spec-Zone.ru › Django 5.1

Виджеты

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

HTML, генерируемый встроенными виджетами, использует синтаксис HTML5, ориентируясь на <!DOCTYPE html>. Например, он использует boolean-атрибуты, такие как 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)
>>> print(f)
<div>Name:<input type="text" name="name" required></div>
<div>Url:<input type="url" name="url" required></div>
<div>Comment:<input type="text" name="comment" required></div>

На реальной веб-странице вам, вероятно, не нужно, чтобы все виджеты выглядели одинаково. Возможно, вам нужен больший элемент ввода для комментария, и возможно, для виджета «имя» нужен специальный CSS-класс. Также можно указать атрибут «тип», чтобы воспользоваться новыми типами ввода HTML5. Для этого используйте аргумент Widget.attrs при создании виджета:

class CommentForm(forms.Form):
    name = forms.CharField(widget=forms.TextInput(attrs={"class": "special"}))
    url = forms.URLField()
    comment = forms.CharField(widget=forms.TextInput(attrs={"size": "40"}))

Вы также можете изменить виджет в определении формы:

class CommentForm(forms.Form):
    name = forms.CharField()
    url = forms.URLField()
    comment = forms.CharField()

    name.widget.attrs.update({"class": "special"})
    comment.widget.attrs.update(size="40")

Или, если поле не объявлено непосредственно в форме (например, поля формы модели), вы можете использовать атрибут Form.fields:

class CommentForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields["name"].widget.attrs.update({"class": "special"})
        self.fields["comment"].widget.attrs.update(size="40")

Django затем включит дополнительные атрибуты в выводимый результат:

>>> f = CommentForm(auto_id=False)
>>> print(f)
<div>Name:<input type="text" name="name" class="special" required></div>
<div>Url:<input type="url" name="url" required></div>
<div>Comment:<input type="text" name="comment" size="40" required></div>

Вы также можете установить HTML id, используя attrs. См. BoundField.id_for_label для примера.

Стиль классов виджетов

С виджетами можно добавлять ресурсы (css и javascript) и более глубоко настраивать их внешний вид и поведение.

Вкратце, вам потребуется создать подкласс виджета и либо определить «Media» внутренний класс, либо создать свойство «media».

Эти методы включают в себя продвинутое программирование на Python и подробно описаны в руководстве по Ресурсы форм.

Базовые классы виджетов

Базовые классы виджетов Widget и MultiWidget наследуются всеми встроенными виджетами и могут служить основой для пользовательских виджетов.

Widget

class Widget(attrs=None) [source]

Этот абстрактный класс не может быть визуализирован, но предоставляет базовый атрибут 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) [source]

Очищает и возвращает значение для использования в шаблоне виджета. value не гарантируется, что будет допустимым входом, поэтому реализации подклассов должны быть защищены от некорректных данных.

get_context(name, value, attrs) [source]

Возвращает словарь значений для использования при визуализации шаблона виджета. По умолчанию словарь содержит один ключ, 'widget', который представляет собой представление виджета в виде словаря с следующими ключами:

  • 'name': Имя поля из аргумента name.
  • 'is_hidden': Логическое значение, указывающее, скрыт ли этот виджет.
  • 'required': Логическое значение, указывающее, является ли поле для этого виджета обязательным.
  • 'value': Значение, возвращаемое методом format_value().
  • 'attrs': HTML-атрибуты, которые нужно установить для визуализированного виджета. Комбинация атрибута attrs и аргумента attrs.
  • 'template_name': Значение self.template_name.

Подклассы Widget могут предоставлять пользовательские значения контекста, переопределяя этот метод.

id_for_label(id_) [source]

Возвращает HTML-атрибут ID этого виджета для использования с <label>, учитывая ID поля. Возвращает пустую строку, если ID недоступен.

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

render(name, value, attrs=None, renderer=None) [source]

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

value_from_datadict(data, files, name) [source]

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

value_omitted_from_data(data, files, name) [source]

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

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

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

use_fieldset

Атрибут, определяющий, должен ли виджет быть сгруппирован в <fieldset> с <legend> при визуализации. По умолчанию False, но True, когда виджет содержит несколько тегов <input> таких, как CheckboxSelectMultiple, RadioSelect, MultiWidget, SplitDateTimeWidget и SelectDateWidget.

use_required_attribute(initial) [source]

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

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

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

MultiWidget

class MultiWidget(widgets, attrs=None) [source]

Виджет, состоящий из нескольких виджетов. 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) [source]

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

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

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

Пример — как 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) [source]

В дополнение к ключу '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 [source]
  • input_type: 'text'
  • template_name: 'django/forms/widgets/text.html'
  • Отображается как: <input type="text" ...>

NumberInput

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

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

EmailInput

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

URLInput

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

PasswordInput

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

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

render_value

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

HiddenInput

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

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

DateInput

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

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

format

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

Если аргумент format не указан, по умолчанию используется первый формат из DATE_INPUT_FORMATS и учитывается Локализация формата. Форматы %U, %W, и %j этим виджетом не поддерживаются.

DateTimeInput

class DateTimeInput [source]
  • input_type: 'text'
  • template_name: 'django/forms/widgets/datetime.html'
  • Отображается как: <input type="text" ...>

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

format

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

Если аргумент format не указан, по умолчанию используется первый формат из DATETIME_INPUT_FORMATS и учитывается Локализация формата. Форматы %U, %W, и %j этим виджетом не поддерживаются.

По умолчанию, микросекундная часть значения времени всегда устанавливается в 0. Если микросекунды необходимы, используйте подкласс с атрибутом supports_microseconds установленным в True.

TimeInput

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

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

format

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

Если аргумент format не указан, по умолчанию используется первый формат из TIME_INPUT_FORMATS и учитывается Локализация формата.

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

Textarea

class Textarea [source]
  • template_name: 'django/forms/widgets/textarea.html'
  • Отображается как: <textarea>...</textarea>

Selector and checkbox widgets

Эти виджеты используют HTML-элементы <select>, <input type="checkbox">, и <input type="radio">.

Виджеты, которые отображают несколько вариантов, имеют атрибут option_template_name, который задаёт шаблон для отображения каждого варианта. Например, для виджета Select, select_option.html отображает <option> для <select>.

CheckboxInput

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

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

check_test

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

Select

class Select [source]
  • 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 [source]
  • template_name: 'django/forms/widgets/select.html'
  • option_template_name: 'django/forms/widgets/select_option.html'

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

SelectMultiple

class SelectMultiple [source]
  • template_name: 'django/forms/widgets/select.html'
  • option_template_name: 'django/forms/widgets/select_option.html'

Аналогично Select, но позволяет выбрать несколько значений: <select multiple>...</select>

RadioSelect

class RadioSelect [source]
  • template_name: 'django/forms/widgets/radio.html'
  • option_template_name: 'django/forms/widgets/radio_option.html'

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

<div>
  <div><input type="radio" name="..."></div>
  ...
</div>

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

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

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

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

Включив теги <label>.

Для более тонкой настройки можно использовать атрибуты каждой радиокнопки tag, choice_label и id_for_label. Например, этот шаблон…

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

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

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

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

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

При переборе радиокнопок теги label и input содержат соответственно атрибуты for и id. Каждая радиокнопка имеет атрибут id_for_label для вывода ID элемента.

CheckboxSelectMultiple

class CheckboxSelectMultiple [source]
  • 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 в противном случае.

END_OF_DOCUMENT_MARKER

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

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

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

FileInput

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

ClearableFileInput

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

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

MultipleHiddenInput

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

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

SplitDateTimeWidget

class SplitDateTimeWidget [source]
  • 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

class SplitHiddenDateTimeWidget [source]
  • template_name: 'django/forms/widgets/splithiddendatetime.html'

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

SelectDateWidget

class SelectDateWidget [source]
  • 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/5.1/ref/forms/widgets/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API