Поле DateTimeField
Поле DateTimeField применяется в формах Django для обработки ввода даты и времени.
Оно автоматически преобразует строковые значения из формы в объект datetime.datetime
Python, а также выполняет валидацию введенных данных. Поле может принимать различные
аргументы для настройки поведения, такие как обязательность, начальное значение,
формат ввода и другие.
Синтаксис
from django import forms
class MyForm(forms.Form):
dt = forms.DateTimeField(label="Date and Time", required=True, initial=None)
Базовый пример использования
Создадим простую форму с полем для ввода даты и времени:
from 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"):
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
Работа с данными формы
После отправки формы поле DateTimeField преобразует введенную строку
в объект datetime.datetime:
from 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})
Результат выполнения кода:
"Event time: 2026-09-07 14:30:00"
"Type: <class 'datetime.datetime'>"
Валидация данных
Поле DateTimeField автоматически проверяет корректность введенной даты и времени.
Если пользователь введет некорректную строку, форма вернет ошибку:
from 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)
Результат выполнения кода:
{'event_time': ['Enter a valid date/time.']}
Использование с моделями
В форме на основе модели (ModelForm) поле DateTimeField
автоматически создается для соответствующих полей модели:
from 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 модели:
from 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})
Результат выполнения кода:
"Event Conference created at 2026-09-07 14:30:00"
Настройка формата ввода
Можно указать формат ввода даты и времени с помощью параметра input_formats:
from 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']
)
Теперь пользователь может вводить дату в одном из указанных форматов:
data = {'name': 'Workshop', 'event_time': '07/09/2026 15:30'}
form = EventForm(data)
if form.is_valid():
print(form.cleaned_data['event_time'])
Результат выполнения кода:
"2026-09-07 15:30:00"
Установка начального значения
Для установки начального значения поля используйте параметр initial.
Это может быть объект datetime.datetime или строка в правильном формате:
from 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())
Результат выполнения кода:
"2026-09-08 14:30:00"
Работа с часовыми поясами
DateTimeField поддерживает часовые пояса, если используется
с USE_TZ = True. При этом поле возвращает объект
datetime.datetime в формате с часовым поясом:
from 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}")
Результат выполнения кода:
"Time: 2026-09-07 14:30:00+00:00"
"Timezone: UTC"