我正在与 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个(每个员工)空白表格,以便为每个员工在接下来的两周内输入新的时间,而不必创建每个人手动时间表?
在视图功能上执行此操作:
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
中进行。
请注意,批量操作不使用模型的保存功能。