Создание списка пустых форм при отправке

Я работаю с Django и имею одну форму для каждого сотрудника, срок действия которой истекает каждые две недели. Например, срок действия табеля за прошлую неделю истек, и мне нужно создать список новых табелей.

Как создать несколько пустых форм, основанных на создании нового временного периода?

Контекст:


class TwoWeekPeriod(models.Model):
    start_date = models.DateField(_("Start Date"))
    end_date = models.DateField(_("End Date"))
    week_number = models.IntegerField(_("Week Number"))

class CreateNewTimesheet(models.Model):
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
    start_date = models.DateField(_("Start Date"))
    end_date = models.DateField(_("End Date"))
    two_week_period = models.ForeignKey(TwoWeekPeriod, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def save(self, *args, **kwargs):
        week_number = (self.start_date - timezone.now().date()).days // 14 + 1
        two_week_period, _ = TwoWeekPeriod.objects.get_or_create(
            start_date=self.start_date,
            end_date=self.end_date,
            defaults={'week_number': week_number}
        )
        self.two_week_period = two_week_period
        super().save(*args, **kwargs)

Пример табеля учета рабочего времени:

class Foo(model.Models)
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
    time_in = ###
    time_out = ###

Как я могу использовать CreateNewTimesheet, скажем, 14 (для каждого сотрудника) пустых форм, используя модель Foo для каждого сотрудника, чтобы ввести новое время для каждого сотрудника на следующий двухнедельный период, без необходимости создавать каждый отдельный табель вручную?

Сделайте следующее в функции просмотра:

class NewPayPeriodCreate(CreateView): # class based view
    model = TwoWeekPeriod
    template_name = "form.html"
    form_class = TwoWeekPeriodForm
    success_url = reverse_lazy('app_name:success_url_name')

    def form_valid(self, form):  # override the action that occurs when valid form data has been POSTed.
        response = super().form_valid(form) # do the default actions of the function, which includes saving the TwoWeekPeriod object

        employee_queryset = Employee.objects.all()
        for employee in employee_queryset:
            CreateNewTimesheet.objects.create(
                employee=employee,
                start_date=self.object.start_date, # access the TwoWeekPeriod object just created with 'self.object'
                end_date=self.object.end_date,
                two_week_period=self.object
            )

        return response

Обратите внимание, что это один запрос к базе данных для каждого сотрудника, поэтому, если у вас много сотрудников, могут возникнуть проблемы с производительностью.

удалите переопределенное сохранение save в CreateNewTimesheet. Поскольку вам нужно сделать несколько записей CreateNewTimesheet, вы не можете начать с одной из этих записей - если бы вы хотели сделать переопределенное сохранение, вы бы сделали это в TwoWeekPeriod.

Обратите внимание, что массовые действия не используют функцию сохранения модели.

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