Django: отправка только одной формы, созданной с помощью цикла for

В моем коде я использую класс CreateView с ListView. Я также использую цикл for, чтобы показать все возможные доступные даты (которые создаются в модели StaffDuty). Мой пользователь должен иметь возможность просто забронировать одну дату.

Моя проблема в том, что я не могу сохранить одну встречу, я должен собрать все формы, показанные в моем списке, чтобы иметь возможность отправить. Как я могу это решить?

models.py

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)  

    def __str__(self):
        return self.event.name | str(self.staff.date_work)

    def get_absolute_url(self):
        return reverse('home')

views.py


class UserAppointmentAddView(CreateView):
    model = UserAppointment
    form_class = UserAppointmentForm
    template_name = "reservation.html"

    def form_valid(self, form):
        form.instance.user = self.request.user.userinformation
      
    def get_context_data(self, **kwargs):
        kwargs['object_list'] = StaffDuty.objects.order_by('id')
        return super(UserAppointmentAddView, self).get_context_data(**kwargs)

html

<div class="container">
<form method="post">       
{% csrf_token %} 
{% for appointment in object_list %}                                        

      <span>{{ form.staff }}</span>
      <span>{{ form.event }}</span>
      <span>{{ form.morning_hour }}</span>
      <span>{{ form.afternoon_hour }}</span>           
      <div class="primary-btn">
      <input type="submit" value="submit" class="btn btn-primary">
      </div>
</div>
     
{% endfor %}

Если я правильно понимаю, вы генерируете одну и ту же форму для каждого экземпляра назначения/модели, что не будет работать. То, что будет отправлено обратно, не идентифицирует, к какому объекту назначения оно относится. Это можно исправить с помощью скрытого поля object_id ... которое является частью того, что делают для вас наборы форм моделей. Или вы можете поместить его в значение ваших нескольких кнопок отправки и вытащить его из request.POST, если вы хотите самостоятельно обрабатывать валидацию.

Чистое решение в Django заключается в создании model formset. Когда форма отправляется, вы обрабатываете форму, которая изменилась, и игнорируете остальные. (На самом деле это даст вам списки измененных и неизмененных объектов).

Другой подход заключается в использовании JavaScript для заполнения одной формы (возможно, со скрытыми полями), когда пользователь нажимает на значения в таблице. Или никакой формы в шаблоне, просто POST из JavaScript и проверка того, что возвращается через форму (или иным образом)

Формсеты и модельные наборы форм выглядят устрашающе сложными, когда вы впервые пытаетесь их использовать. На самом деле это не так, но первый же написанный вами набор может показаться вам немного сложным в освоении. Проще, если вы сможете найти что-то работающее, что уже написал кто-то другой, и адаптировать это.

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