РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
458 of 818 menu

Виджет 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,
    виджет для ввода даты и времени
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить