Spec-Zone.ru › Django 4.2

Виджеты

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

HTML, сгенерированный встроенными виджетами, использует синтаксис HTML5, нацеленный на <!DOCTYPE html>. Например, он использует булевы атрибуты, такие как checked, а не стиль XHTML checked='checked'.

Подсказка

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

Указание виджетов

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

Однако, если вы хотите использовать другой виджет для поля, вы можете использовать аргумент widget в определении поля. Например:

from django import forms


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

Это определит форму с комментарием, который использует более крупный виджет Textarea, а не виджет по умолчанию TextInput.

Установка аргументов для виджетов

Многие виджеты имеют необязательные дополнительные аргументы; их можно установить при определении виджета в поле. В следующем примере устанавливается атрибут years для SelectDateWidget:

from django import forms

BIRTH_YEAR_CHOICES = ["1980", "1981", "1982"]
FAVORITE_COLORS_CHOICES = [
    ("blue", "Blue"),
    ("green", "Green"),
    ("black", "Black"),
]


class SimpleForm(forms.Form):
    birth_year = forms.DateField(
        widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES)
    )
    favorite_colors = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple,
        choices=FAVORITE_COLORS_CHOICES,
    )

Дополнительную информацию о доступных виджетах и принимаемых ими аргументах см. в разделе Встроенные виджеты.

Виджеты, наследующие от виджета Select

Виджеты, наследующие от виджета Select, работают с вариантами. Они представляют пользователю список вариантов для выбора. Разные виджеты представляют этот выбор по-разному; виджет Select использует представление HTML-списка <select>, а RadioSelect использует радиокнопки.

Select виджеты по умолчанию используются в ChoiceField полях. Выбранные, отображаемые в виджете, наследуются от ChoiceField и изменение ChoiceField.choices обновит Select.choices. Например:

>>> from django import forms
>>> CHOICES = [("1", "First"), ("2", "Second")]
>>> choice_field = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICES)
>>> choice_field.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices = []
>>> choice_field.choices = [("1", "First and only")]
>>> choice_field.widget.choices
[('1', 'First and only')]

Однако виджеты, которые предлагают атрибут choices, могут использоваться с полями, которые не основаны на вариантах — такими как CharField — но рекомендуется использовать поле, основанное на ChoiceField, когда варианты являются неотъемлемой частью модели, а не просто представлением виджета.

Настройка экземпляров виджетов

Когда Django рендерит виджет как HTML, он рендерит только минимальную разметку - Django не добавляет имена классов или другие атрибуты, специфичные для виджета. Это означает, что, например, все виджеты TextInput будут выглядеть одинаково на ваших веб-страницах.

Существует два способа настройки виджетов: на уровне экземпляра виджета и на уровне класса виджета.

Настройка экземпляров виджетов

Если вы хотите, чтобы один экземпляр виджета выглядел по-другому, вам нужно указать дополнительные атрибуты во время создания объекта виджета и привязки его к полю формы (и, возможно, добавить некоторые правила в свои CSS-файлы).

Например, рассмотрим следующую форму:

from django import forms


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

Эта форма будет содержать три виджета TextInput по умолчанию с рендерингом по умолчанию — без CSS-классов и дополнительных атрибутов. Это означает, что поля ввода для каждого виджета будут рендериться точно так же:

>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>

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

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

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

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

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

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

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

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

>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" class="special" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" size="40" required></td></tr>

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

Настройка классов виджетов

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

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

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

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

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

Widget

class Widget(attrs=None)

Этот абстрактный класс нельзя отобразить, но он предоставляет базовый атрибут attrs. Вы также можете реализовать или переопределить метод render() в пользовательских виджетах.

attrs

Словарь, содержащий атрибуты HTML, которые необходимо установить для отображаемого виджета.

>>> from django import forms
>>> name = forms.TextInput(attrs={"size": 10, "title": "Your name"})
>>> name.render("name", "A name")
'<input title="Your name" type="text" name="name" value="A name" size="10">'

Если вы присвоите значение True или False атрибуту, он будет отображен как булевый атрибут HTML5:

>>> name = forms.TextInput(attrs={"required": True})
>>> name.render("name", "A name")
'<input name="name" type="text" value="A name" required>'
>>>
>>> name = forms.TextInput(attrs={"required": False})
>>> name.render("name", "A name")
'<input name="name" type="text" value="A name">'
supports_microseconds

Атрибут, по умолчанию установленный в True. Если он установлен в False, часть микросекунд значений datetime и time будут установлены в 0.

format_value(value)

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

get_context(name, value, attrs)

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

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

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

id_for_label(id_)

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

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

render(name, value, attrs=None, renderer=None)

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

value_from_datadict(data, files, name)

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

value_omitted_from_data(data, files, name)

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

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

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

use_fieldset
Новая функция в Django 4.1.

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

use_required_attribute(initial)

Учитывая значение initial поля формы, возвращает, можно ли отобразить виджет с атрибутом 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)

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

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

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

DateInput

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

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

format

Формат отображения начального значения этого поля.

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

DateTimeInput

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

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

format

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

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

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

TimeInput

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

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

format

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

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

Для обработки микросекунд см. DateTimeInput.

Textarea

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

Селекторы и чекбоксы

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

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

CheckboxInput

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

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

check_test

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

Select

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

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

NullBooleanSelect

class NullBooleanSelect
  • template_name: 'django/forms/widgets/select.html'
  • option_template_name: 'django/forms/widgets/select_option.html'

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

SelectMultiple

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

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

RadioSelect

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CheckboxSelectMultiple

class CheckboxSelectMultiple
  • template_name: 'django/forms/widgets/checkbox_select.html'
  • option_template_name: 'django/forms/widgets/checkbox_option.html'

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

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

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

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

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

Загрузка файлов

FileInput

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

ClearableFileInput

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

Композитные виджеты

MultipleHiddenInput

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

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

SplitDateTimeWidget

class SplitDateTimeWidget
  • template_name: 'django/forms/widgets/splitdatetime.html'

Обёртка (используя MultiWidget) вокруг двух виджетов: DateInput для даты и TimeInput для времени. Должен использоваться с SplitDateTimeField, а не с DateTimeField.

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

date_format

Аналогично DateInput.format

time_format

Аналогично TimeInput.format

date_attrs
time_attrs

Аналогично Widget.attrs. Словарь, содержащий HTML-атрибуты, которые будут установлены для отображаемых DateInput и TimeInput виджетов соответственно. Если эти атрибуты не установлены, используется Widget.attrs.

SplitHiddenDateTimeWidget

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

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

SelectDateWidget

class SelectDateWidget
  • template_name: 'django/forms/widgets/select_date.html'

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

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

years

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

months

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

Ключи словаря соответствуют номеру месяца (индексируется с 1) и значения — отображаемым месяцам:

MONTHS = {
    1: _("jan"),
    2: _("feb"),
    3: _("mar"),
    4: _("apr"),
    5: _("may"),
    6: _("jun"),
    7: _("jul"),
    8: _("aug"),
    9: _("sep"),
    10: _("oct"),
    11: _("nov"),
    12: _("dec"),
}
empty_label

Если DateField не является обязательным, SelectDateWidget будет иметь пустой выбор вверху списка (который --- по умолчанию). Вы можете изменить текст этой метки с помощью атрибута empty_label. empty_label может быть string, list, или tuple. При использовании строки, все выпадающие списки будут иметь пустой выбор с этой меткой. Если empty_label является list или tuple из 3 строковых элементов, выпадающие списки будут иметь свою собственную пользовательскую метку. Метки должны быть в этом порядке ('year_label', 'month_label', 'day_label').

# A custom empty label with string
field1 = forms.DateField(widget=SelectDateWidget(empty_label="Nothing"))

# A custom empty label with tuple
field1 = forms.DateField(
    widget=SelectDateWidget(
        empty_label=("Choose Year", "Choose Month", "Choose Day"),
    ),
)

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.2/ref/forms/widgets/

Spec-Zone.ru

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