• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

Виджеты

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

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

Совет

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

Назначение виджета

При добавлении поля на форму, Django использует стандартный виджет, наиболее подходящий к отображаемому типу данных. Для того, чтобы узнать какой виджет использует интересующий вас тип поля обратитесь к built-in fields.

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

from django import forms

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

Этот код создают форму, у которой полю комментария назначен виджет class:Textarea вместо стандартного TextInput widget.

Аргументы виджетов

Большинство виджетов принимают дополнительные аргументы. Они могут быть назначены при определении виджета для поля. В следующем примере атрибут 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 widgets are used by default on ChoiceField fields. The choices displayed on the widget are inherited from the ChoiceField and changing ChoiceField.choices will update Select.choices. For example:

>>> 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()

This form will include three default TextInput widgets, with default rendering – no CSS class, no extra attributes. This means that the input boxes provided for each widget will be rendered exactly the same:

>>> 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 добавит дополнительные атрибуты в генерируемый HTML код:

>>> 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», возвращающее экземпляр этого класса.

Эти методы требуют некоторого объёма продвинутого кода и подробно описаны в руководстве по ресурсам форм.

Основные классы виджетов

Основные классы виджетов Widget и MultiWidget унаследованы всеми встроенными виджетами и могут являться основой для ваших собственных виджетов.

Виджеты

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">'

If you assign a value of True or False to an attribute, it will be rendered as an HTML5 boolean attribute:

>>> 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(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 None if an ID isn’t available.

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

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

Отрисовывает виджет в HTML, используя заданный модуль визуализации. Если рендерер имеет значение Нет, используется рендерер из настройки FORM_RENDERER.

value_from_datadict(data, files, name)

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

value_omitted_from_data(data, files, name)

Принимает словарь данных и имя виджета, возвращает значения для этого виджета. Возвращает None, если значение не предоставлено.

Результат метода влияет на то, вернется ли поле в форме модели к значению по умолчанию <topics-modelform-save>.

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

use_required_attribute(initial)

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

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

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

Changed in Django 3.1:

In older versions, True was returned for FileInput when initial was set.

SelectDateWidget

class MultiWidget(widgets, attrs=None)

Виджет, который состоит из множества виджетов. Класс MultiWidget предназначен для поля MultiValueField.

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

widgets

An iterable containing the widgets needed. For example:

>>> 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">'

You may provide a dictionary in order to specify custom suffixes for the name attribute on each subwidget. In this case, for each (key, widget) pair, the key will be appended to the name of the widget in order to generate the attribute value. You may provide the empty string ('') for a single key, in order to suppress the suffix for one widget. For example:

>>> 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)

The constructor creates several Select widgets in a list. The super() method uses this list to setup the widget.

Обязательный метод decompress() разбивает значение datetime.date на значение дня, месяца и года для каждого виджета. Следует отметить, что метод обрабатывает случай, когда value равно None.

Стандартная реализация метода value_from_datadict() возвращает список значений для каждого Widget. Это полезно при использовании MultiWidget совместно с MultiValueField, но так как мы желаем использовать этот виджет совместно с DateField, который принимает единственное значение, мы переопределили этот метод для соединения данных всех подчинённых виджетов в datetime.date. Метод получает данные из словаря POST, создаёт и проверяет дату. Если она проходит проверку, мы возвращаем строку, в противном случае возвращаем пустую строку, что заставляет form.is_valid вернуть False.

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

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

Виджеты для ввода текста

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

TextInput

class TextInput
  • input_type: 'текст'

  • имя_шаблона: 'django/forms/widgets/text.html'

  • Ввод текста: <input type="text" ...>

NumberInput

class NumberInput
  • input_type: 'число'

  • имя_шаблона: 'django/forms/widgets/number.html'

  • Ввод текста: <input type="number" ...>

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

EmailInput

class EmailInput
  • input_type: 'электронная почта'

  • имя_шаблона: 'django/forms/widgets/email.html'

  • Ввод текста: <input type="email" ...>

URLInput

class URLInput
  • input_type: 'url'

  • имя_шаблона: 'django/forms/widgets/url.html'

  • Ввод текста: <input type="url" ...>

PasswordInput

class PasswordInput
  • input_type: 'пароль'

  • имя_шаблона: 'django/forms/widgets/password.html'

  • Ввод пароля: <input type='password' ...>

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

render_value

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

HiddenInput

class HiddenInput
  • input_type: 'скрытый'

  • имя_шаблона: 'django/forms/widgets/hidden.html'

  • Скрытый ввод: <input type='hidden' ...>

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

DateInput

class DateInput
  • input_type: 'текст'

  • имя_шаблона: 'django/forms/widgets/date.html'

  • Ввод текста: <input type="text" ...>

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

format

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

If no format argument is provided, the default format is the first format found in DATE_INPUT_FORMATS and respects Формат локализации.

DateTimeInput

class DateTimeInput
  • input_type: 'текст'

  • имя_шаблона: 'django/forms/widgets/datetime.html'

  • Ввод текста: <input type="text" ...>

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

format

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

If no format argument is provided, the default format is the first format found in DATETIME_INPUT_FORMATS and respects Формат локализации.

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

TimeInput

class TimeInput
  • input_type: 'текст'

  • имя_шаблона: 'django/forms/widgets/time.html'

  • Ввод текста: <input type="text" ...>

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

format

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

Если аргумент format не предоставлен, то стандартный формат берется из TIME_INPUT_FORMATS с учетом format-localization.

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

Textarea

class Textarea
  • template_name: 'django/forms/widgets/textarea.html'

  • Текстовая область: <textarea>...</textarea>

Виджеты выбора и отметки

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

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

CheckboxInput

class CheckboxInput
  • Чекбокс: <input type='checkbox' ...>

  • имя_шаблона: 'django/forms/widgets/checkbox.html'

  • Чекбокс: <input type='checkbox' ...>

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

check_test

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

Select

class Select
  • имя_шаблона: 'django/forms/widgets/select.html'

  • option_template_name: 'django/forms/widgets/select_option.html'

  • Виджет выбора: <select><option ...>...</select>

choices

Этот атрибут является необязательным, если поле не имеет атрибут choices. В противном случае, его содержимое имеет преимущество над атрибутами Field.

NullBooleanSelect

class NullBooleanSelect
  • имя_шаблона: 'django/forms/widgets/select.html'

  • option_template_name: 'django/forms/widgets/select_option.html'

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

SelectMultiple

class SelectMultiple
  • имя_шаблона: 'django/forms/widgets/select.html'

  • option_template_name: 'django/forms/widgets/select_option.html'

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

RadioSelect

class RadioSelect
  • имя_шаблона: '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 <li> tags:

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

Для более тонкого управления процессом генерации HTML кода, вы можете выводить радио кнопки в шаблон в цикле. Рассмотрим форму 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>

If you decide not to loop over the radio buttons – e.g., if your template includes {{ myform.beatles }} – they’ll be output in a <ul> with <li> tags, as above.

The outer <ul> container receives the id attribute of the widget, if defined, or BoundField.auto_id otherwise.

При генерации радио кнопок теги label and 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, но отображается в виде списка чекбоксов.

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

The outer <ul> container receives the id attribute of the widget, if defined, or BoundField.auto_id otherwise.

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

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

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

FileInput

class FileInput
  • имя_шаблона: 'django/forms/widgets/file.html'

  • Загрузка файла: <input type='file' ...>

ClearableFileInput

class ClearableFileInput
  • имя_шаблона: '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 для времени.

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

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

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. Если указана строка, каждый <select> будет содержать пустое значение. Если empty_label содержит list или tuple из 3-х строк – для каждого <select> будет использоваться свое значение. Элементы используются в следующем порядке: ('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"),
    ),
)
Back to Top