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

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