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})})
Вернуться на верх