提交时创建空表单列表

0 投票
1 回答
37 浏览
提问于 2025-04-14 16:35

我正在使用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 来输入每个员工接下来两周的工时,而不需要手动一个个去创建每个工时表呢?

1 个回答

0

在视图函数中这样做:

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

要注意的是,对于每个员工,这里会进行一次数据库查询,所以如果员工很多的话,可能会影响性能。

去掉在 CreateNewTimesheet 中重写的 save 方法。因为你需要创建多个 CreateNewTimesheet 记录,所以不能从其中一个记录开始。如果你想重写保存的方法,应该在 TwoWeekPeriod 中进行。

只需记住,批量操作不使用模型的保存功能。

撰写回答