Используйте CreateView и ListView в одном шаблоне и правильно используйте form.instance
В моем проекте пользователь должен иметь возможность подать заявку на прием (класс UserAppointment) на основе диспозитивности, предоставленной сотрудниками (класс StaffDuty). Поэтому я хотел бы использовать класс CreateView для модели UserAppointment и ListViewClass для модели StaffDuty в одном шаблоне. С помощью моего кода я могу получить доступ к данным из модели StaffDuty, но я не могу отправить форму для модели UserAppointment, так как кнопка отправки ничего не делает.
.
Также я хотел бы автоматически назначить правящий ключ staff и event и передать данные из StaffDuty для заполнения form.instance.date_appointment датой, указанной в модели staff, а form.instance.event_name - именем события, которое находится в модели Event. Но мой код вообще не работает
models.py
class Event(models.Model):
name = models.CharField(max_length=255)
staff_needed = models.PositiveIntegerField()
date = models.DateField()
spots_total = models.PositiveIntegerField()
venue = models.CharField(max_length=255)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('event_details', args=[str(self.id)])
class StaffDuty(models.Model):
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
date_work = models.DateField()
shift = models.CharField(max_length=255)
def __str__(self):
return self.event.name | str(self.date_work)
class UserAppointment(models.Model):
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
staff = models.ForeignKey(StaffDuty, on_delete=models.CASCADE)
event = models.ForeignKey(Event, on_delete=models.CASCADE)
event_name = models.CharField(max_length=255)
date_appointment = models.DateField(null=True)
morning_hour = models.CharField(max_length=255)
afternoon_hour = models.CharField(max_length=255)
spots_free = models.PositiveIntegerField(null=True)
def __str__(self):
return self.event.name | str(self.staff.date_work)
def get_absolute_url(self):
return reverse('home')
views.py
class StaffDutyAddView(CreateView):
model = StaffDuty
form_class = StaffDutyForm
template_name = 'reservation.html'
success_url = reverse_lazy('home')
class UserAppointmentAddView(CreateView):
model = UserAppointment
form_class = UserAppointmentForm
template_name = "reservation.html"
def form_valid(self, form):
form.instance.user = self.request.user.userinformation
# Code incomplete and that not work
form.instance.staff = StaffDuty.objects.filter(user=self.request.user.staffduty).first()
#form.instance.date_appointment = # add date_work from StaffDuty class
form.instance.event = Event.objects.filter(user=self.request.user.event).first()
#form.instance.event_name = # add name of the event from Event class
return super(UserAppointmentAddView, self).form_valid(form)
def get_context_data(self, **kwargs):
kwargs['object_list'] = StaffDuty.objects.order_by('id')
return super(UserAppointmentAddView, self).get_context_data(**kwargs)
html
P.s (мне пришлось немного изменить свой код, чтобы сделать его короче и понятнее. Это могут быть опечатки, которых нет в моем первоначальном коде)