Django получение ввода radio select в форме
Что мне нужно, так это страница, где для каждого пользователя можно выбрать, присутствовал ли он, разрешено ли отсутствие или нет. Мне удалось создать страницу, где это возможно и может быть представлено, смотрите изображение, которое я прикрепил. Как код работает сейчас
Моя проблема в том, что я понятия не имею, как я могу получить доступ к данным, которые я отправил. Я использовал name={{user.id}} для имени радиокнопки, но как мне теперь получить доступ к этому входу в моем представлении? Я хочу иметь возможность делать что-то другое, если, например, выбран Absent, но я не знаю, как это сделать.
Вот мой код: baksgewijs/mbaksgewijs_attendance.html
<form action="" method=POST>
{% csrf_token %}
<div class="table-responsive fixed-length">
<table id = "userTable" class="table table-striped table-hover table-sm table-bordered">
<tbody>
{% for user in users %}
<tr>
<td> {{ user }}
<td>
<div class="form-check">
<input class="form-check-input" type="radio" name={{user.id}} id="radio">
<label class="form-check-label" for="flexRadioDefault1">
Aanwezig
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name={{user.id}} id="radio">
<label class="form-check-label" for="flexRadioDefault2">
Afwezig
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name={{user.id}} id="radio">
<label class="form-check-label" for="flexRadioDefault2">
Geoorloofd afwezig
</label>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<br>
<button class='btn btn-primary active' type="submit"> Update Peloton </button>
</div>
views.py
def baksgewijs_attendance(request):
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/mbaksgewijs_attendance.html', {"form": CreateAttendance})
return render(request, "baksgewijs/mbaksgewijs_attendance.html", {
"users" : users
})
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)
}
models.py
class Attendance(models.Model):
attendance = models.CharField(max_length=13)
user = models.ForeignKey('puma_core.User', on_delete=models.CASCADE)
baksgewijs = models.ForeignKey(Baksgewijs, on_delete=models.CASCADE)
def __str__(self):
return self.attendance
Я уже задавал вопрос об этом раньше, но не совсем понял, как это исправить, поэтому сейчас попробовал другой подход. У меня такое чувство, что теперь и с моим вводом ничего не получается. Заранее большое спасибо за помощь. <3
Вам просто нужно добавить value
к вашим радиокнопкам. Тогда при получении значения радиокнопок с помощью request.POST.get('your_input_name')
вы получите value
той радиокнопки, которая была выбрана.
В вашем шаблоне должно получиться что-то вроде этого :
<div class="form-check">
<input class="form-check-input" type="radio" name={{user.id}} id="radio" value="Aanwezig">
<label class="form-check-label" for="flexRadioDefault1">
Aanwezig
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name={{user.id}} id="radio" value="Afwezig">
<label class="form-check-label" for="flexRadioDefault2">
Afwezig
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="radio" name={{user.id}} id="radio" value="Geoorloofd afwezig">
<label class="form-check-label" for="flexRadioDefault2">
Geoorloofd afwezig
</label>
</div>
Затем, в вашем файле views.py :
if form.is_valid():
form.save()
for user in users:
user_attendance = form.cleaned_data.get(user.id)
# Do something with your user depending on the value of user_attendance
message = messages.success(request, ("De aanwezigheid is opgeslagen"))
return HttpResponseRedirect(reverse("baksgewijs_index"), {"message" : message})