Используйте 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 (мне пришлось немного изменить свой код, чтобы сделать его короче и понятнее. Это могут быть опечатки, которых нет в моем первоначальном коде)

Вернуться на верх