Виджет SelectDateWidget

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

Синтаксис

pythonfrom django import forms
from django.forms.widgets import SelectDateWidget

class MyForm(forms.Form):
  date_field = forms.DateField(
    widget=SelectDateWidget(
      years=range(2000, 2030),
      empty_label=("Choose year", "Choose month", "Choose day"),
      attrs={"class": "my-date-select"}
    )
  )

Параметры виджета SelectDateWidget:

years - итерируемый объект (список или диапазон) с годами для отображения в выпадающем списке. Если параметр не указан, годы выводятся от текущего года минус 10 лет до текущего года плюс 10 лет.

empty_label - метка для пустого значения в каждом из трёх выпадающих списков. Может быть строкой (одинаковая для всех списков) или кортежем из трёх строк для отдельной настройки каждого списка.

attrs - словарь с HTML-атрибутами для элемента виджета.

Пример . Базовое использование

Создадим простую форму с полем для ввода даты рождения:

pythonfrom django import forms
from django.forms.widgets import SelectDateWidget

class BirthdayForm(forms.Form):
  birth_date = forms.DateField(
    widget=SelectDateWidget(
      years=range(1950, 2025),
      empty_label="---"
    )
  )

В шаблоне форма будет отображаться с тремя выпадающими списками:

html<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Submit</button>
</form>

Результат в браузере будет содержать три выпадающих списка:

html<select name="birth_date_year" id="id_birth_date_year">
  <option value="">---</option>
  <option value="1950">1950</option>
  <option value="1951">1951</option>
  <!-- ... -->
  <option value="2024">2024</option>
</select>
<select name="birth_date_month" id="id_birth_date_month">
  <option value="">---</option>
  <option value="1">January</option>
  <option value="2">February</option>
  <!-- ... -->
  <option value="12">December</option>
</select>
<select name="birth_date_day" id="id_birth_date_day">
  <option value="">---</option>
  <option value="1">1</option>
  <option value="2">2</option>
  <!-- ... -->
  <option value="31">31</option>
</select>

Пример . С разными метками для пустых значений

Настроим виджет с разными подписями для каждого списка:

pythonfrom django import forms
from django.forms.widgets import SelectDateWidget

class EventForm(forms.Form):
  event_date = forms.DateField(
    widget=SelectDateWidget(
      years=range(2020, 2031),
      empty_label=("Choose year", "Choose month", "Choose day"),
      attrs={"class": "date-select"}
    )
  )

В этом случае каждый выпадающий список будет иметь свою подпись для пустого значения:

html<select name="event_date_year" class="date-select">
  <option value="">Choose year</option>
  <option value="2020">2020</option>
  <!-- ... -->
</select>
<select name="event_date_month" class="date-select">
  <option value="">Choose month</option>
  <option value="1">January</option>
  <!-- ... -->
</select>
<select name="event_date_day" class="date-select">
  <option value="">Choose day</option>
  <option value="1">1</option>
  <!-- ... -->
</select>

Пример . Использование в ModelForm

Используем виджет в форме, созданной на основе модели:

pythonfrom django.db import models
from django import forms
from django.forms.widgets import SelectDateWidget

class Person(models.Model):
  name = models.CharField(max_length=100)
  birth_date = models.DateField()

class PersonForm(forms.ModelForm):
  class Meta:
    model = Person
    fields = ["name", "birth_date"]
    widgets = {
      "birth_date": SelectDateWidget(
        years=range(1960, 2026),
        empty_label=("Год", "Месяц", "День")
      ),
    }

Теперь можно использовать эту форму для создания и редактирования записей модели Person:

pythonfrom django.shortcuts import render, redirect

def create_person(request):
  if request.method == "POST":
    form = PersonForm(request.POST)
    if form.is_valid():
      person = form.save()
      print(f"Created person: {person.name}")
      return redirect("success")
  else:
    form = PersonForm()
  return render(request, "form.html", {"form": form})

Пример . Обработка данных из виджета

Покажем, как обрабатывать данные, полученные из формы с виджетом SelectDateWidget:

pythonfrom django import forms
from django.forms.widgets import SelectDateWidget
from datetime import date

class CheckoutForm(forms.Form):
  delivery_date = forms.DateField(
    widget=SelectDateWidget(
      years=range(2025, 2031),
      empty_label=("Year", "Month", "Day")
    )
  )

def process_form(request):
  if request.method == "POST":
    form = CheckoutForm(request.POST)
    if form.is_valid():
      delivery = form.cleaned_data["delivery_date"]
      print(f"Delivery date: {delivery}")
      print(f"Year: {delivery.year}")
      print(f"Month: {delivery.month}")
      print(f"Day: {delivery.day}")
  else:
    form = CheckoutForm()
  return render(request, "checkout.html", {"form": form})

Результат выполнения при отправке формы с датой 2025-12-25:

python"Delivery date: 2025-12-25"
"Year: 2025"
"Month: 12"
"Day: 25"

Смотрите также

  • класс Form,
    основной класс для создания форм в Django
  • класс ModelForm,
    класс для создания форм на основе моделей
  • поле DateField,
    поле формы для ввода даты
  • виджет DateTimeInput,
    виджет для ввода даты и времени