Spec-Zone.ru › Django 2.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. Также можно указать атрибут «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

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 поля. Возвращает None если 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_required_attribute(initial) [source]

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

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

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

MultiWidget

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

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

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

widgets

Итерируемый объект, содержащий необходимые виджеты.

И один обязательный метод:

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(), MultiValueWidget добавляет ключ 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, и учитывается Локализация форматов.

DateTimeInput

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

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

Эти виджеты используют 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, но отображается как список радиокнопок внутри тегов <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>

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

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

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

CheckboxSelectMultiple

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

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

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

choices

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

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 может быть строкой, кортежем или списком из 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/2.2/ref/forms/widgets/

Spec-Zone.ru

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