Spec-Zone.ru › Django 1.11

Виджеты

Виджет — это представление 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-класс. Также можно указать атрибут «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'}))

Затем 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" required />'

Если вы присвойте значение 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 не гарантируется, что будет корректным вводом, поэтому реализации подклассов должны быть защищены от некорректных данных.

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

В более старых версиях этот метод является закрытым API, имеющим имя _format_value(). Старое имя будет работать до Django 2.0.

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 этого виджета для использования меткой, учитывая ID поля. Возвращает None, если ID недоступен.

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

render(name, value, attrs=None, renderer=None) [source]

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

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

Добавлен аргумент renderer. Поддержка подклассов, которые его не принимают, будет удалена в Django 2.1.

value_from_datadict(data, files, name) [source]

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

value_omitted_from_data(data, files, name) [source]
Введено в Django 1.10.2.

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

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

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

use_required_attribute(initial) [source]
Введено в Django 1.10.1.

Учитывая значение 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 для отображения даты с днём, месяцем и годом в разных select-полях. Этот виджет предназначен для использования с 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(DateSelectorWidget, self).__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'
  • Renders as: <input type="text" ...>

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

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

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

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

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

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/1.11/ref/forms/widgets/

Spec-Zone.ru

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