DurationField

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

Поле принимает значения в формате длительности, например, "3 days, 5 hours" или "P3DT5H". После валидации данные преобразуются в объект timedelta, который можно использовать для дальнейших вычислений и операций.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  duration = forms.DurationField(**options)

Где **options - это набор дополнительных параметров, таких как required, label, initial, widget и другие.

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

Давайте создадим форму с полем для ввода длительности рабочего времени:

pythonfrom 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"
  )

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

Рассмотрим пример обработки данных из формы с полем длительности:

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

python"Total hours: 2.5"

Пример . С модельной формой

Рассмотрим использование DurationField в модельной форме для работы с моделью, содержащей поле длительности:

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

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

python"Current duration: 2 days, 3:30:00"

Валидация и очистка данных

Поле DurationField автоматически выполняет валидацию введённых данных. Можно также добавить собственную валидацию с помощью метода clean_duration:

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