Поле DateTimeField

Поле DateTimeField применяется в формах Django для обработки ввода даты и времени. Оно автоматически преобразует строковые значения из формы в объект datetime.datetime Python, а также выполняет валидацию введенных данных. Поле может принимать различные аргументы для настройки поведения, такие как обязательность, начальное значение, формат ввода и другие.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  dt = forms.DateTimeField(label="Date and Time", required=True, initial=None)

Базовый пример использования

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

pythonfrom django import forms

class EventForm(forms.Form):
  name = forms.CharField(max_length=100)
  event_time = forms.DateTimeField(label="Event Time", required=True)

В шаблоне такая форма отобразится как поле ввода с текстовым полем, в которое пользователь может ввести дату и время в формате по умолчанию (например, "2026-09-07 14:30:00"):

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

Работа с данными формы

После отправки формы поле DateTimeField преобразует введенную строку в объект datetime.datetime:

pythonfrom django.shortcuts import render
from .forms import EventForm
from datetime import datetime

def create_event(request):
  if request.method == 'POST':
    form = EventForm(request.POST)
    if form.is_valid():
      event_time = form.cleaned_data['event_time']
      print(f"Event time: {event_time}")
      print(f"Type: {type(event_time)}")
  else:
    form = EventForm()
  return render(request, 'event.html', {'form': form})

Результат выполнения кода:

python"Event time: 2026-09-07 14:30:00"
"Type: <class 'datetime.datetime'>"

Валидация данных

Поле DateTimeField автоматически проверяет корректность введенной даты и времени. Если пользователь введет некорректную строку, форма вернет ошибку:

pythonfrom django import forms

class EventForm(forms.Form):
  name = forms.CharField(max_length=100)
  event_time = forms.DateTimeField(label="Event Time")

# Попытка отправки с некорректными данными
data = {'name': 'Conference', 'event_time': 'invalid date'}
form = EventForm(data)
if not form.is_valid():
  print(form.errors)

Результат выполнения кода:

python{'event_time': ['Enter a valid date/time.']}

Использование с моделями

В форме на основе модели (ModelForm) поле DateTimeField автоматически создается для соответствующих полей модели:

pythonfrom django.db import models
from django import forms

class Event(models.Model):
  name = models.CharField(max_length=100)
  created_at = models.DateTimeField(auto_now_add=True)
  start_time = models.DateTimeField()

class EventForm(forms.ModelForm):
  class Meta:
    model = Event
    fields = ['name', 'start_time']

Теперь форма автоматически будет использовать поле DateTimeField для атрибута start_time модели:

pythonfrom django.shortcuts import render, redirect
from .forms import EventForm

def create_event(request):
  if request.method == 'POST':
    form = EventForm(request.POST)
    if form.is_valid():
      event = form.save()
      print(f"Event {event.name} created at {event.created_at}")
      return redirect('event_list')
  else:
    form = EventForm()
  return render(request, 'create_event.html', {'form': form})

Результат выполнения кода:

python"Event Conference created at 2026-09-07 14:30:00"

Настройка формата ввода

Можно указать формат ввода даты и времени с помощью параметра input_formats:

pythonfrom django import forms

class EventForm(forms.Form):
  name = forms.CharField(max_length=100)
  event_time = forms.DateTimeField(
    label="Event Time",
    input_formats=['%d/%m/%Y %H:%M', '%d-%m-%Y %H:%M', '%Y-%m-%d %H:%M']
  )

Теперь пользователь может вводить дату в одном из указанных форматов:

pythondata = {'name': 'Workshop', 'event_time': '07/09/2026 15:30'}
form = EventForm(data)
if form.is_valid():
  print(form.cleaned_data['event_time'])

Результат выполнения кода:

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

Установка начального значения

Для установки начального значения поля используйте параметр initial. Это может быть объект datetime.datetime или строка в правильном формате:

pythonfrom django import forms
from datetime import datetime, timedelta

class EventForm(forms.Form):
  name = forms.CharField(max_length=100)
  event_time = forms.DateTimeField(
    label="Event Time",
    initial=datetime.now() + timedelta(days=1),
    input_formats=['%Y-%m-%d %H:%M:%S']
  )
  
form = EventForm()
print(form['event_time'].value())

Результат выполнения кода:

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

Работа с часовыми поясами

DateTimeField поддерживает часовые пояса, если используется с USE_TZ = True. При этом поле возвращает объект datetime.datetime в формате с часовым поясом:

pythonfrom django import forms
from django.conf import settings
settings.USE_TZ = True

class EventForm(forms.Form):
  name = forms.CharField(max_length=100)
  event_time = forms.DateTimeField(label="Event Time")

data = {'name': 'Meeting', 'event_time': '2026-09-07 14:30:00'}
form = EventForm(data)
if form.is_valid():
  dt = form.cleaned_data['event_time']
  print(f"Time: {dt}")
  print(f"Timezone: {dt.tzinfo}")

Результат выполнения кода:

python"Time: 2026-09-07 14:30:00+00:00"
"Timezone: UTC"

Смотрите также

  • класс Form,
    базовый класс для создания форм в Django
  • класс ModelForm,
    класс для создания форм на основе моделей
  • метод save,
    который сохраняет данные формы в базу данных
  • метод is_valid,
    который выполняет валидацию данных формы