Создание списка пустых форм при отправке
Я работаю с 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
.
Обратите внимание, что массовые действия не используют функцию сохранения модели.