SplitDateTimeWidget
Виджет SplitDateTimeWidget применяется к полю формы SplitDateTimeField и отображает его в виде двух независимых полей ввода: одно для даты, другое для времени. По умолчанию для даты используется виджет DateInput с типом 'text', а для времени - TimeInput с типом 'text'. Виджет позволяет настраивать отображение каждого из полей отдельно через параметры конструктора.
Синтаксис
from django.forms import SplitDateTimeWidget, DateInput, TimeInput
widget = SplitDateTimeWidget(
date_attrs=None,
time_attrs=None,
date_format=None,
time_format=None,
attrs=None
)
Параметры конструктора:
-
date_attrs- словарь с атрибутами для поля ввода даты -
time_attrs- словарь с атрибутами для поля ввода времени -
date_format- формат отображения даты (по умолчанию'%Y-%m-%d') -
time_format- формат отображения времени (по умолчанию'%H:%M:%S') -
attrs- общие атрибуты для обоих полей ввода
Пример . Использование в форме
Создадим форму с полем для ввода даты и времени с использованием виджета SplitDateTimeWidget:
from django import forms
from django.forms import SplitDateTimeWidget
class EventForm(forms.Form):
event_datetime = forms.SplitDateTimeField(
widget=SplitDateTimeWidget(
date_attrs={'class': 'date-input', 'placeholder': 'YYYY-MM-DD'},
time_attrs={'class': 'time-input', 'placeholder': 'HH:MM:SS'}
)
)
Результат отображения формы в шаблоне:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
Пример . С обработкой данных
Рассмотрим полный пример обработки данных, введённых через виджет SplitDateTimeWidget:
from django import forms
from django.forms import SplitDateTimeWidget
from django.shortcuts import render
from datetime import datetime
class MeetingForm(forms.Form):
meeting_time = forms.SplitDateTimeField(
widget=SplitDateTimeWidget(
date_attrs={'class': 'date-field'},
time_attrs={'class': 'time-field'}
)
)
def meeting_view(request):
if request.method == 'POST':
form = MeetingForm(request.POST)
if form.is_valid():
meeting_datetime = form.cleaned_data['meeting_time']
print(meeting_datetime)
else:
form = MeetingForm()
return render(request, 'meeting.html', {'form': form})
Результат выполнения кода при вводе даты 2026-09-07 и времени 14:30:00:
"2026-09-07 14:30:00"
Пример . С изменением форматов отображения
Изменим форматы отображения даты и времени для виджета SplitDateTimeWidget:
from django import forms
from django.forms import SplitDateTimeWidget
class CustomFormatForm(forms.Form):
event_datetime = forms.SplitDateTimeField(
widget=SplitDateTimeWidget(
date_format='%d.%m.%Y',
time_format='%H:%M'
)
)
Теперь поля ввода будут отображать дату в формате 'дд.мм.гггг', а время - в формате 'чч:мм'. При этом данные, введённые пользователем, должны соответствовать этим форматам, иначе валидация не пройдёт.
Пример . С использованием модели
Виджет SplitDateTimeWidget часто используется в ModelForm для полей с типом DateTimeField:
from django.db import models
from django import forms
from django.forms import SplitDateTimeWidget
class Meeting(models.Model):
title = models.CharField(max_length=100)
datetime = models.DateTimeField()
def __str__(self):
return self.title
class MeetingForm(forms.ModelForm):
class Meta:
model = Meeting
fields = ['title', 'datetime']
widgets = {
'datetime': SplitDateTimeWidget(
date_attrs={'class': 'date-picker'},
time_attrs={'class': 'time-picker'}
)
}
Теперь поле 'datetime' в форме будет отображаться как два отдельных поля ввода, но в базе данных сохранится как единое значение DateTimeField.
Смотрите также
-
виджет
SplitHiddenDateTimeWidget,
который отображает скрытые поля для даты и времени -
поле
SplitDateTimeField,
которое используется совместно с виджетом -
виджет
SelectDateWidget,
который отображает дату в виде трёх выпадающих списков -
виджет
MultiWidget,
который является базовым классом для составных виджетов