提交时创建空白表格列表

问题描述 投票:0回答:1

我正在与 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
,假设使用模型
Foo
为每个员工使用14个(每个员工)空白表格,以便为每个员工在接下来的两周内输入新的时间,而不必创建每个人手动时间表?

python django django-crispy-forms
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

请注意,这是每个员工的 1 个数据库查询,因此如果您有很多员工,可能需要考虑性能问题。

删除

save
中覆盖的
CreateNewTimesheet
。由于您需要创建多个
CreateNewTimesheet
记录,因此您无法从其中一个记录开始 - 如果您想进行覆盖保存,您可以在
TwoWeekPeriod
中进行。

请注意,批量操作不使用模型的保存功能。

© www.soinside.com 2019 - 2024. All rights reserved.