Как определить и отобразить Django formset для регистрации часов, потраченных на проект каждый день в течение месяца?

Я создаю Django сайт, на котором пользователи могут регистрировать свое время, потраченное на работу над определенным проектом (Time Report). В будущем отчеты о времени будут подлежать процессу утверждения и, возможно, станут источниками для расчета счетов клиентам, но сейчас мне сложно настроить это в Django.

Я хочу, чтобы отчеты о времени содержали несколько строк проекта, и каждая строка проекта должна иметь столько полей ввода, сколько дней в определенном месяце. Это позволит пользователю регистрировать количество часов, потраченных каждый день на все проекты, над которыми он работает. Кроме того, каждый проект может быть представлен в нескольких строках (таким образом, пользователь может регистрировать различные задачи в рамках проекта отдельно, например, часы, потраченные на планирование проекта, по сравнению с временем, потраченным на разработку).

Проекты определяются отдельно (отдельная модель).

Я считаю, что мне нужны следующие модели для поддержки требований:

from django.db import models

class TimeReport(models.Model):
    employee = models.ForeignKey('employees.Employee', on_delete=models.CASCADE)
    start_date = models.DateField() #to calculate Time Report month
    status = models.CharField(max_length=20, default='draft')

class ProjectLine(models.Model):
    time_report = models.ForeignKey('TimeReport', on_delete=models.CASCADE)
    project = models.ForeignKey('projects.Project', on_delete=models.CASCADE)
    comment = models.TextField(blank=True, null=True)

class ProjectLineDay(models.Model):
    project_line = models.ForeignKey(ProjectLine, on_delete=models.CASCADE)
    date = models.DateField()
    hours = models.DecimalField(max_digits=2, decimal_places=0) 

Я хочу добиться примерно следующего (пример в excel):

Пример ожидаемой формы в excel

Я понял, что мне нужно использовать Django formsets, но у меня нет опыта работы с ними, и пока я не знаю, как начать.

Я пробовал создать Django форму с динамически вычисляемым количеством дней (например, для текущего месяца), но не смог связать ее с логикой View: (я использую django-autocomplete-light для автозавершения выбора)

class ProjectLineForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['project'] = forms.ModelChoiceField(queryset=Project.objects.all(), widget=autocomplete.ModelSelect2(url='projects:project-autocomplete'))
        today = datetime.date.today()
        days_in_month = calendar.monthrange(today.year, today.month)[1]
        for day in range(1, days_in_month+1):
            self.fields[f'day_{day}'] = forms.IntegerField(label=False, widget=forms.NumberInput(), required=False)
        self.fields['comment'] = forms.CharField(required=False)

ProjectLineFormset = formset_factory(ProjectLineForm, extra=1, can_delete=True, min_num=1)

Я использую Crispy Forms для формирования формы, поэтому я также пытаюсь понять, как отобразить ее в виде сетки.

Вернуться на верх