Spec-Zone.ru › Django 2.0

Виджеты

Виджет — это представление 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) [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]
Добавлено в Django 1.11.

Возвращает словарь значений для использования при отображении шаблона виджета. По умолчанию словарь содержит единственный ключ, '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.

Изменено в Django 1.11:

Добавлен аргумент 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().replace(microsecond=0)]
        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'
  • Renders as: <input type="text" ...>

Takes same arguments as TextInput, with one more optional argument:

format

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

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

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

TimeInput

class TimeInput [source]
  • input_type: 'text'
  • template_name: 'django/forms/widgets/time.html'
  • Renders as: <input type="text" ...>

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

format

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

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

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

Textarea

class Textarea [source]
  • template_name: 'django/forms/widgets/textarea.html'
  • Renders as: <textarea>...</textarea>

Selector and checkbox widgets

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

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

CheckboxInput

class CheckboxInput [source]
  • input_type: 'checkbox'
  • template_name: 'django/forms/widgets/checkbox.html'
  • Renders as: <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'
  • Renders as: <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="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 для вывода ID элемента.

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 для вывода ID элемента.

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

FileInput

class FileInput [source]
  • template_name: 'django/forms/widgets/file.html'
  • Renders as: <input type="file" ...>

ClearableFileInput

class ClearableFileInput [source]
  • template_name: 'django/forms/widgets/clearable_file_input.html'
  • Renders as: <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.0/ref/forms/widgets/

Spec-Zone.ru

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