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