提交时创建空表单列表
我正在使用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
中进行。
只需记住,批量操作不使用模型的保存功能。