Виджет SelectDateWidget
Виджет SelectDateWidget применяется к полям формы типа DateField
и преобразует стандартное поле ввода даты в три отдельных выпадающих
списка для выбора дня, месяца и года. Этот виджет удобен для пользователей,
так как предоставляет наглядный интерфейс выбора даты и исключает
возможность ввода некорректных значений. Виджет принимает несколько
параметров для настройки отображения, включая порядок полей,
пустые значения и диапазон годов.
Синтаксис
from 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-атрибутами для элемента виджета.
Пример . Базовое использование
Создадим простую форму с полем для ввода даты рождения:
from 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="---"
)
)
В шаблоне форма будет отображаться с тремя выпадающими списками:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
Результат в браузере будет содержать три выпадающих списка:
<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>
Пример . С разными метками для пустых значений
Настроим виджет с разными подписями для каждого списка:
from 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"}
)
)
В этом случае каждый выпадающий список будет иметь свою подпись для пустого значения:
<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
Используем виджет в форме, созданной на основе модели:
from 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:
from 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:
from 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:
"Delivery date: 2025-12-25"
"Year: 2025"
"Month: 12"
"Day: 25"
Смотрите также
-
класс
Form,
основной класс для создания форм в Django -
класс
ModelForm,
класс для создания форм на основе моделей -
поле
DateField,
поле формы для ввода даты -
виджет
DateTimeInput,
виджет для ввода даты и времени