Spec-Zone.ru › Django 2.1

Виджеты

Виджет — это представление 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, когда варианты присущи модели, а не просто виджету.

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

При рендеринге виджета в HTML Django использует минимальную разметку — 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) [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 этого виджета для использования меткой, заданной 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 widget.template_name with widget=subwidget %}
{% endfor %}

Вот пример виджета, который наследуется от MultiWidget для отображения даты с днём, месяцем и годом в разных выпадающих списках. Этот виджет предназначен для использования с DateField, а не с MultiValueField, поэтому мы реализовали value_from_datadict():

from datetime import date
from django.forms import widgets

class DateSelectorWidget(widgets.MultiWidget):
    def __init__(self, attrs=None):
        # create choices for days, months, years
        # example below, the rest snipped for brevity.
        years = [(year, year) for year in (2011, 2012, 2013)]
        _widgets = (
            widgets.Select(attrs=attrs, choices=days),
            widgets.Select(attrs=attrs, choices=months),
            widgets.Select(attrs=attrs, choices=years),
        )
        super().__init__(_widgets, attrs)

    def decompress(self, value):
        if value:
            return [value.day, value.month, value.year]
        return [None, None, None]

    def value_from_datadict(self, data, files, name):
        datelist = [
            widget.value_from_datadict(data, files, name + '_%s' % i)
            for i, widget in enumerate(self.widgets)]
        try:
            D = date(
                day=int(datelist[0]),
                month=int(datelist[1]),
                year=int(datelist[2]),
            )
        except ValueError:
            return ''
        else:
            return str(D)

Конструктор создает несколько виджетов Select в кортеже. Класс super использует этот кортеж для настройки виджета.

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

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

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

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
Новое в Django 2.0.

Аналогично 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/2.1/ref/forms/widgets/

Spec-Zone.ru

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