Spec-Zone.ru › Django 3.2

Виджеты

Виджет — это представление Django для HTML-элемента ввода. Виджет обрабатывает рендеринг HTML и извлечение данных из словаря GET/POST, соответствующего виджету.

HTML, сгенерированный встроенными виджетами, использует синтаксис HTML5, ориентированный на <!DOCTYPE html>. Например, он использует булевы атрибуты, такие как checked, а не стиль XHTML checked='checked'.

Подсказка

Не следует путать виджеты с полями формы. Поля формы занимаются логикой валидации ввода и используются непосредственно в шаблонах. Виджеты занимаются рендерингом HTML-элементов ввода формы на веб-странице и извлечением сырых отправленных данных. Однако виджеты должны быть назначены полям формы.

Указание виджетов

При указании поля в форме Django использует подходящий по типу данных виджет по умолчанию. Чтобы узнать, какой виджет используется для какого поля, обратитесь к документации о встроенных классах полей.

Однако, если вы хотите использовать другой виджет для поля, вы можете использовать аргумент widget в определении поля. Например:

from django import forms

class CommentForm(forms.Form):
    name = forms.CharField()
    url = forms.URLField()
    comment = forms.CharField(widget=forms.Textarea)

Это определит форму с комментарием, использующим виджет Textarea большего размера, а не виджет по умолчанию TextInput.

Установка аргументов для виджетов

Многие виджеты имеют необязательные дополнительные аргументы; они могут быть установлены при определении виджета в поле. В следующем примере атрибут years установлен для виджета SelectDateWidget:

from django import forms

BIRTH_YEAR_CHOICES = ['1980', '1981', '1982']
FAVORITE_COLORS_CHOICES = [
    ('blue', 'Blue'),
    ('green', 'Green'),
    ('black', 'Black'),
]

class SimpleForm(forms.Form):
    birth_year = forms.DateField(widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES))
    favorite_colors = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple,
        choices=FAVORITE_COLORS_CHOICES,
    )

Дополнительную информацию о доступных виджетах и принимаемых ими аргументах см. в разделе Встроенные виджеты.

Виджеты, унаследованные от виджета Select

Виджеты, унаследованные от виджета Select, работают с выбором. Они предоставляют пользователю список вариантов для выбора. Разные виджеты представляют этот выбор по-разному; виджет Select сам использует представление HTML-списка <select>, а RadioSelect использует радиокнопки.

Select виджеты используются по умолчанию в полях ChoiceField. Выводимые в виджете варианты наследуются от поля ChoiceField, и изменение ChoiceField.choices обновит Select.choices. Например:

>>> from django import forms
>>> CHOICES = [('1', 'First'), ('2', 'Second')]
>>> choice_field = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICES)
>>> choice_field.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices
[('1', 'First'), ('2', 'Second')]
>>> choice_field.widget.choices = []
>>> choice_field.choices = [('1', 'First and only')]
>>> choice_field.widget.choices
[('1', 'First and only')]

Однако виджеты, которые предлагают атрибут choices, могут использоваться с полями, которые не основаны на выборе — например, с CharField — но рекомендуется использовать поле на основе ChoiceField, когда варианты присущи модели, а не просто представлению виджета.

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

Когда Django рендерит виджет как HTML, он рендерит только минимальную разметку — Django не добавляет имена классов или другие атрибуты, специфичные для виджетов. Это означает, например, что все виджеты TextInput будут выглядеть одинаково на ваших веб-страницах.

Существует два способа настройки виджетов: по экземпляру виджета и по классу виджета.

Стиль экземпляров виджетов

Если вы хотите, чтобы один экземпляр виджета выглядел по-другому, вам нужно указать дополнительные атрибуты во время создания объекта виджета и назначения его полю формы (и, возможно, добавить некоторые правила в свои CSS-файлы).

Например, рассмотрим следующую форму:

from django import forms

class CommentForm(forms.Form):
    name = forms.CharField()
    url = forms.URLField()
    comment = forms.CharField()

Эта форма будет содержать три виджета по умолчанию TextInput с рендерингом по умолчанию — без CSS-классов и дополнительных атрибутов. Это означает, что поля ввода для каждого виджета будут отображаться точно так же:

>>> f = CommentForm(auto_id=False)
>>> f.as_table()
<tr><th>Name:</th><td><input type="text" name="name" required></td></tr>
<tr><th>Url:</th><td><input type="url" name="url" required></td></tr>
<tr><th>Comment:</th><td><input type="text" name="comment" required></td></tr>

На реальной веб-странице вы, вероятно, не хотите, чтобы каждый виджет выглядел одинаково. Возможно, вы захотите больший элемент ввода для комментария, и возможно, вы захотите, чтобы у виджета «имя» был какой-то специальный CSS-класс. Также можно указать атрибут «тип», чтобы воспользоваться новыми типами ввода 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)

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

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

get_context(name, value, attrs)

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

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

value_from_datadict(data, files, name)

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

value_omitted_from_data(data, files, name)

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

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

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

use_required_attribute(initial)

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

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

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

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

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

MultiWidget

class MultiWidget(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', 'paul'])
'<input type="text" name="name" value="john"><input type="text" name="name_last" value="paul">'

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

decompress(value)

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

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

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

Пример: как 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)

В дополнение к ключу 'widget', описанному в Widget.get_context(), MultiWidget добавляет ключ widget['subwidgets'].

Эти ключи можно перебирать в шаблоне виджета:

{% for subwidget in widget.subwidgets %}
    {% include subwidget.template_name with widget=subwidget %}
{% endfor %}

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

from datetime import date
from django import forms

class DateSelectorWidget(forms.MultiWidget):
    def __init__(self, attrs=None):
        days = [(day, day) for day in range(1, 32)]
        months = [(month, month) for month in range(1, 13)]
        years = [(year, year) for year in [2018, 2019, 2020]]
        widgets = [
            forms.Select(attrs=attrs, choices=days),
            forms.Select(attrs=attrs, choices=months),
            forms.Select(attrs=attrs, choices=years),
        ]
        super().__init__(widgets, attrs)

    def decompress(self, value):
        if isinstance(value, date):
            return [value.day, value.month, value.year]
        elif isinstance(value, str):
            year, month, day = value.split('-')
            return [day, month, year]
        return [None, None, None]

    def value_from_datadict(self, data, files, name):
        day, month, year = super().value_from_datadict(data, files, name)
        # DateField expects a single string that it can parse into a date.
        return '{}-{}-{}'.format(year, month, day)

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

Необходимый метод decompress() разбивает значение datetime.date на значения дня, месяца и года, соответствующие каждому виджету. Если была выбрана некорректная дата, например, 30 февраля, DateField передаёт в этот метод строку, которую нужно разобрать. Конечный return обрабатывает случай, когда value является None, что означает, что у нас нет значений по умолчанию для подвиджетов.

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

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

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

Виджеты для ввода текста

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

TextInput

class TextInput
  • input_type: 'text'
  • template_name: 'django/forms/widgets/text.html'
  • Отображается как: <input type="text" ...>

NumberInput

class NumberInput
  • input_type: 'number'
  • template_name: 'django/forms/widgets/number.html'
  • Отображается как: <input type="number" ...>

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

EmailInput

class EmailInput
  • input_type: 'email'
  • template_name: 'django/forms/widgets/email.html'
  • Отображается как: <input type="email" ...>

URLInput

class URLInput
  • input_type: 'url'
  • template_name: 'django/forms/widgets/url.html'
  • Отображается как: <input type="url" ...>

PasswordInput

class PasswordInput
  • input_type: 'password'
  • template_name: 'django/forms/widgets/password.html'
  • Отображается как: <input type="password" ...>

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

render_value

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

HiddenInput

class HiddenInput
  • input_type: 'hidden'
  • template_name: 'django/forms/widgets/hidden.html'
  • Отображается как: <input type="hidden" ...>

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

DateInput

class DateInput
  • input_type: 'text'
  • template_name: 'django/forms/widgets/date.html'
  • Отображается как: <input type="text" ...>

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

format

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

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

DateTimeInput

class 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

class TimeInput
  • input_type: 'text'
  • template_name: 'django/forms/widgets/time.html'
  • Отображается как: <input type="text" ...>

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

format

Формат отображения начального значения этого поля.

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

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

Textarea

class 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

class CheckboxInput
  • input_type: 'checkbox'
  • template_name: 'django/forms/widgets/checkbox.html'
  • Отображается как: <input type="checkbox" ...>

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

check_test

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

Select

class Select
  • 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
  • template_name: 'django/forms/widgets/select.html'
  • option_template_name: 'django/forms/widgets/select_option.html'

Виджет селектора с опциями «Неизвестно», «Да» и «Нет»

SelectMultiple

class SelectMultiple
  • template_name: 'django/forms/widgets/select.html'
  • option_template_name: 'django/forms/widgets/select_option.html'

Аналогичен Select, но позволяет множественный выбор: <select multiple>...</select>

RadioSelect

class 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 в противном случае.

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

CheckboxSelectMultiple

class 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

class FileInput
  • template_name: 'django/forms/widgets/file.html'
  • Отображается как: <input type="file" ...>

ClearableFileInput

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

Составные виджеты

MultipleHiddenInput

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

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

SplitDateTimeWidget

class 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

class SplitHiddenDateTimeWidget
  • template_name: 'django/forms/widgets/splithiddendatetime.html'

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

SelectDateWidget

class 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 может быть 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/3.2/ref/forms/widgets/

Spec-Zone.ru

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