SplitDateTimeWidget

Виджет SplitDateTimeWidget применяется к полю формы SplitDateTimeField и отображает его в виде двух независимых полей ввода: одно для даты, другое для времени. По умолчанию для даты используется виджет DateInput с типом 'text', а для времени - TimeInput с типом 'text'. Виджет позволяет настраивать отображение каждого из полей отдельно через параметры конструктора.

Синтаксис

pythonfrom django.forms import SplitDateTimeWidget, DateInput, TimeInput

widget = SplitDateTimeWidget(
  date_attrs=None,
  time_attrs=None,
  date_format=None,
  time_format=None,
  attrs=None
)

Параметры конструктора:

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

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

pythonfrom 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'}
    )
  )

Результат отображения формы в шаблоне:

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

Пример . С обработкой данных

Рассмотрим полный пример обработки данных, введённых через виджет SplitDateTimeWidget:

pythonfrom 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:

python"2026-09-07 14:30:00"

Пример . С изменением форматов отображения

Изменим форматы отображения даты и времени для виджета SplitDateTimeWidget:

pythonfrom 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:

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