Компоненты формы («виджеты»)

Компонент формы - это представление Django элемента ввода HTML. Компонент отвечает за создание HTML-кода и извлечение собственных данных в словарь GET / POST.

HTML-код, сгенерированный встроенными компонентами, использует синтаксис HTML5 с заголовком . Например, такие логические атрибуты предпочтительнее стиля XHTML .<!DOCTYPE html> checked 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 по умолчанию включает три компонента с рендерингом HTML по умолчанию - без класса 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 ) и дополнительно настраивать их внешний вид и поведение.

Говоря коротко, необходимо создать подкласс компонента и либо определить интернет-класс «Медиа», либо создать свойство «медиа» .

Эти методы предполагают относительно продвинутое использование программирования на Python и подробно описаны в тематическом руководстве файлов приложений к формам .

Widget Базовые классы

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

Widget

classWidget ( attrs = None )

Этот абстрактный класс нельзя отобразить как есть, но он предоставляет базовый атрибут attrs . Вы также можете реализовать или переопределить метод render() в пользовательских компонентах.

attrs

Словарь, содержащий атрибуты HTML, которые необходимо определить для отображаемого компонента.

>>> from django import forms
>>> name = forms.TextInput(attrs={'size': 10, 'title': 'Your name'})
>>> name.render('name', 'A name')
'<input title="Your name" type="text" name="name" value="A name" size="10">'

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

get_context( имя , значение , атрибуты )

Возвращает словарь значений для использования при отрисовке шаблонов компонентов. По умолчанию словарь содержит единственный ключ ,, 'widget' который представляет компонент в словаре, содержащем следующие ключи:

  • 'name' : имя элемента управления согласно параметру name .
  • 'is_hidden' : логическое значение, указывающее, скрыт ли этот компонент.
  • 'required' : логическое значение, указывающее, является ли поле этого компонента обязательным.
  • 'value' : значение, возвращаемое format_value() .
  • 'attrs' : атрибуты HTML для определения в конечном компоненте. Комбинация атрибута attrs и параметра attrs .
  • 'template_name' : значение self.template_name .

Подклассы Widget могут предоставлять настраиваемые значения контекста, переопределяя этот метод.

id_for_label( id_ )

Возвращает атрибут HTML id этого компонента для использования тегом <label> на основе атрибута id поля. Возвращает, None если id недоступен.

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

render( имя , значение , attrs = None , renderer = None )

Создает компонент в HTML с использованием данного средства визуализации. Если renderer - None используется настройка движка рендеринга FORM_RENDERER .

value_from_datadict( данные , файлы , имя )

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

value_omitted_from_data( данные , файлы , имя )

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

Результат этого метода определяет, принимает ли поле в форме шаблона значение по умолчанию .

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

use_required_attribute( начальная )

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

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

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

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

В более старых версиях True возвращалось, FileInput когда initial было установлено.

MultiWidget

classMultiWidget ( widgets , attrs = None )

Компонент, состоящий из нескольких компонентов. MultiWidget работает согласованно с полем MultiValueField .

MultiWidget требуется параметр:

widgets

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

>>> from django.forms import MultiWidget, TextInput
>>> widget = MultiWidget(widgets=[TextInput, TextInput])
>>> widget.render('name', ['john', 'paul'])
'<input type="text" name="name_0" value="john"><input type="text" name="name_1" value="paul">'

Вы можете предоставить словарь, чтобы указать настраиваемые суффиксы для name атрибута каждого подвиджета. В этом случае для каждой пары ключ будет добавлен к виджету, чтобы сгенерировать значение атрибута. Вы можете предоставить пустую строку ( ) для одного ключа, чтобы подавить суффикс для одного виджета. Например:(key, widget) name ''

>>> widget = MultiWidget(widgets={'': TextInput, 'last': TextInput})
>>> widget.render('name', ['john', 'lennon'])
'<input type="text" name="name" value="john"><input type="text" name="name_last" value="paul">'

А также обязательный метод:

decompress( значение )

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

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

Логика «декомпрессии» заключается в том, что необходимо «разбить» объединенное значение поля формы на отдельные значения для каждого компонента.

Пример, иллюстрирующий этот процесс, - это 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( имя , значение , атрибуты )

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

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

Встроенные компоненты

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

Компоненты, отвечающие за ввод текста

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

TextInput

класс TextInput
  • input_type : 'text'
  • template_name : 'django/forms/widgets/text.html'
  • Товар: <input type="text" ...>

NumberInput

класс NumberInput
  • input_type : 'number'
  • template_name : 'django/forms/widgets/number.html'
  • Товар: <input type="number" ...>

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

EmailInput

класс EmailInput
  • input_type : 'email'
  • template_name : 'django/forms/widgets/email.html'
  • Товар: <input type="email" ...>

URLInput

класс URLInput
  • input_type : 'url'
  • template_name : 'django/forms/widgets/url.html'
  • Товар: <input type="url" ...>

PasswordInput

класс PasswordInput
  • input_type : 'password'
  • template_name : 'django/forms/widgets/password.html'
  • Товар: <input type="password" ...>

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

render_value

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

HiddenInput

класс HiddenInput
  • input_type : 'hidden'
  • template_name : 'django/forms/widgets/hidden.html'
  • Товар: <input type="hidden" ...>

Обратите внимание, что есть также компонент, MultipleHiddenInput который группирует набор скрытых полей ввода.

DateInput

класс DateInput
  • input_type : 'text'
  • template_name : 'django/forms/widgets/date.html'
  • Товар: <input type="text" ...>

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

format

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

Если параметры format не указаны, формат по умолчанию - это первый формат, найденный с DATE_INPUT_FORMATS учетом локализации формата .

DateTimeInput

класс DateTimeInput
  • input_type : 'text'
  • template_name : 'django/forms/widgets/datetime.html'
  • Товар: <input type="text" ...>

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

format

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

Если параметры format не указаны, формат по умолчанию - это первый формат, найденный с DATETIME_INPUT_FORMATS учетом локализации формата .

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

TimeInput

класс TimeInput
  • input_type : 'text'
  • template_name : 'django/forms/widgets/time.html'
  • Товар: <input type="text" ...>

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

format

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

Если параметры format не указаны, формат по умолчанию - это первый формат, найденный с TIME_INPUT_FORMATS учетом локализации формата .

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

Textarea

класс Textarea
  • 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

класс CheckboxInput
  • input_type : 'checkbox'
  • template_name : 'django/forms/widgets/checkbox.html'
  • Товар: <input type="checkbox" ...>

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

check_test

Исполняемый объект, который принимает значение CheckboxInput и возвращает True , должен ли флажок отображаться для этого значения.

Select

класс Select
  • template_name : 'django/forms/widgets/select.html'
  • option_template_name : 'django/forms/widgets/select_option.html'
  • Товар: <select><option ...>...</select>
choices

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

NullBooleanSelect

класс NullBooleanSelect
  • template_name : 'django/forms/widgets/select.html'
  • option_template_name : 'django/forms/widgets/select_option.html'

Выбор компонента списка с вариантами «Неизвестно», «Да» и «Нет»

SelectMultiple

класс SelectMultiple
  • template_name : 'django/forms/widgets/select.html'
  • option_template_name : 'django/forms/widgets/select_option.html'

Аналогично Select , но допускает множественный выбор:<select multiple>…</select>

RadioSelect

класс RadioSelect
  • 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 иначе.

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

CheckboxSelectMultiple

класс CheckboxSelectMultiple
  • template_name : 'django/forms/widgets/checkbox_select.html'
  • option_template_name : 'django/forms/widgets/checkbox_option.html'

Аналогично SelectMultiple , но отображается в виде списка флажков:

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

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

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

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

Компоненты отправки файлов

FileInput

класс FileInput
  • template_name : 'django/forms/widgets/file.html'
  • Товар: <input type="file" ...>

ClearableFileInput

класс ClearableFileInput
  • template_name : 'django/forms/widgets/clearable_file_input.html'
  • Продукт:, с дополнительным флажком для удаления значения поля, если поле не является обязательным и содержит исходные данные.<input type="file" ...>

Несколько компонентов

MultipleHiddenInput

класс MultipleHiddenInput
  • template_name : 'django/forms/widgets/multiple_hidden.html'
  • Товар: несколько тегов <input type="hidden" ...>

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

SplitDateTimeWidget

класс SplitDateTimeWidget
  • 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

класс SplitHiddenDateTimeWidget
  • template_name : 'django/forms/widgets/splithiddendatetime.html'

Аналогично SplitDateTimeWidget , но использует HiddenInput дату и время.

SelectDateWidget

класс SelectDateWidget
  • 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 может быть строкой, списком или кортежем. Когда используется строка, все списки выбора будут иметь пустой вариант с этим содержимым. Если empty_label это список или кортеж из трех текстовых элементов, каждый из списков выбора имеет собственное содержимое. Текст должен появиться в следующем порядке: .('texte_année', 'texte_mois', 'texte_jour')

# 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"),
    ),
)

Copyright ©2021 All rights reserved