DurationField
Поле DurationField применяется в формах Django для обработки
временных интервалов и длительностей. Оно принимает данные в
формате, совместимом с объектами datetime.timedelta,
и выполняет валидацию введённых значений. Поле может быть
использовано как в обычных формах, так и в модельных формах,
связываясь с соответствующими модельными полями.
Поле принимает значения в формате длительности, например,
"3 days, 5 hours" или "P3DT5H". После валидации данные
преобразуются в объект timedelta, который можно
использовать для дальнейших вычислений и операций.
Синтаксис
from django import forms
class MyForm(forms.Form):
duration = forms.DurationField(**options)
Где **options - это набор дополнительных параметров,
таких как required, label, initial,
widget и другие.
Пример . Использование в форме
Давайте создадим форму с полем для ввода длительности рабочего времени:
from django import forms
class WorkTimeForm(forms.Form):
work_duration = forms.DurationField(
label="Work duration",
required=True,
help_text="Enter time in format: DD days, HH:MM:SS"
)
Пример . Обработка данных
Рассмотрим пример обработки данных из формы с полем длительности:
from django import forms
from datetime import timedelta
class DurationForm(forms.Form):
time_spent = forms.DurationField(
label="Time spent",
initial=timedelta(hours=2, minutes=30)
)
def process_form(request):
if request.method == 'POST':
form = DurationForm(request.POST)
if form.is_valid():
duration = form.cleaned_data['time_spent']
# duration is a timedelta object
total_seconds = duration.total_seconds()
hours = total_seconds / 3600
print(f"Total hours: {hours}")
else:
form = DurationForm()
return render(request, 'form.html', {'form': form})
Результат выполнения кода при вводе "2:30:00":
"Total hours: 2.5"
Пример . С модельной формой
Рассмотрим использование DurationField в модельной
форме для работы с моделью, содержащей поле длительности:
from django.db import models
from django import forms
class Task(models.Model):
name = models.CharField(max_length=100)
duration = models.DurationField(
help_text="Task duration in days: hours:minutes"
)
class TaskForm(forms.ModelForm):
class Meta:
model = Task
fields = ['name', 'duration']
# Использование формы
task = Task.objects.get(id=1)
form = TaskForm(instance=task)
# Отображение текущей длительности
print(f"Current duration: {task.duration}")
Результат выполнения кода:
"Current duration: 2 days, 3:30:00"
Валидация и очистка данных
Поле DurationField автоматически выполняет валидацию
введённых данных. Можно также добавить собственную валидацию
с помощью метода clean_duration:
from django import forms
from datetime import timedelta
class ProjectForm(forms.Form):
time_estimate = forms.DurationField(
label="Time estimate",
required=True
)
def clean_time_estimate(self):
data = self.cleaned_data['time_estimate']
# Проверяем, что длительность не превышает 30 дней
if data > timedelta(days=30):
raise forms.ValidationError(
"Time estimate cannot exceed 30 days"
)
return data
Смотрите также
-
поле
TimeField,
которое используется для работы с временем -
поле
DateTimeField,
которое предназначено для работы с датой и временем -
метод
cleaned_data,
который содержит очищенные данные формы -
метод
is_valid,
который проверяет валидность данных формы