Django - Получение входных данных радиокнопок в цикле
Мне нужна страница для контроля отсутствия, где есть циклы по всем пользователям и для каждого пользователя отображаются 3 радио-кнопки: присутствует, отсутствует и разрешено_отсутствие. После заполнения для каждого пользователя она должна быть отправлена.
Это важная часть моего кода:
HTML baksgewijs_attendance.html
<form class="createattendance-form" action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.non_field_errors }}
{% for user in users %}
{{ user }}
<div class="form-group">
<div>
{{ form.attendance}}
{{ form.attendance.errors }}
</div>
</div>
{% endfor %}
<br>
<div class="form-group">
<button type="submit" class="btn btn-primary save"> Save absence </button>
</div>
</form>
Models.py
class Attendance(models.Model):
attendance = models.CharField(max_length=13)
forms.py
attendance_choices = (
('absent', 'Afwezig'),
('allowedabsent', 'Geoorloofd afwezig'),
('present', 'Aanwezig'),
)
class CreateAttendance(forms.ModelForm):
class Meta:
model = Attendance
fields = ['attendance']
widgets = {
'attendance': forms.RadioSelect(choices=attendance_choices)
}
views.py
def baksgewijs_attendance(request):
peloton = Peloton.objects.all()
users = User.objects.all()
if request.method == "POST":
form = CreateAttendance(request.POST, request.FILES)
if form.is_valid():
form.save()
message = messages.success(request, ("De aanwezigheid is opgeslagen"))
return HttpResponseRedirect(reverse("baksgewijs_index"), {
"message" : message
})
else:
return render(request, 'baksgewijs/baksgewijs_attendance.html', {"form": CreateAttendance})
User.objects.all выдает все имена пользователей.
Проблема в том, что таким образом я могу выбрать только один вариант в целом, в то время как я хочу иметь возможность выбирать отсутствие для каждого пользователя. Как я могу это решить?
Вам следует рассмотреть возможность использования набора форм вместо формы:
https://docs.djangoproject.com/en/4.0/topics/forms/formsets/
Чтобы дать вам представление, forms.py должен выглядеть примерно так:
attendance_choices = (
('absent', 'Afwezig'),
('allowedabsent', 'Geoorloofd afwezig'),
('present', 'Aanwezig'),
)
class CreateAttendance(forms.ModelForm):
class Meta:
model = Attendance
fields = ['user', 'attendance']
widgets = {
'attendance': forms.RadioSelect(choices=attendance_choices)
}
from django.forms import formset_factory
AttendanceFormSet = formset_factory(CreateAttendance)
И тогда vieuws должен быть модифицирован для использования наборов форм
def baksgewijs_attendance(request):
peloton = Peloton.objects.all()
users = User.objects.all()
if request.method == "POST":
formset = AttendanceFormSet(request.POST, request.FILES)
if formset.is_valid():
formset.save()
message = messages.success(request, ("De aanwezigheid is opgeslagen"))
return HttpResponseRedirect(reverse("baksgewijs_index"), {
"message" : message
})
else:
return render(request, 'baksgewijs/baksgewijs_attendance.html', {"formset": AttendanceFormSet(initial={'user': users})})