Проблемы с получением данных из таблицы, которая использует jinja2 (django)
У меня есть таблица, которая содержит некоторый список студентов из моей базы данных, я хочу получить данные из этой html таблицы, которая содержит данные из базы данных, но я хочу добавить, присутствует ли студент или нет.
У меня есть код, который отлично работает, но есть проблема в том, что моя функция принимает данные только последней строки и пропускает все остальные строки
Html код
<div class="container">
<form method="POST" action="takeattendance">
{% csrf_token %}
<div class="form-group">
<h4 style="color:white;"> Select Subject For Attendance</h4>
<select class="btn btn-success" name="subject">
<option selected disabled="true">Subject</option>
{% for sub in subjects%}
<option value="{{ sub.id }}">{{sub.subject_name}}</option>
{%endfor%}
</select>
</div>
<table class="table">
<thead>
<tr>
<th scope="col" style="color:white;"><b>Email</b></th>
<th scope="col" style="color:white;"><b>Roll No.</b></th>
<th scope="col" style="color:white;"><b>First Name</b></th>
<th scope="col" style="color:white;"><b>Last Name</b></th>
<th scope="col" style="color:white;"><b>Year</b></th>
<th scope="col" style="color:white;"><b>Division</b></th>
<th scope="col" style="color:white;"><b>Batch</b></th>
<th scope="col" style="color:white;"><b>Attendance</b></th>
</tr>
</thead>
<tbody>
{% for student in students %}
{% if user.staff.class_coordinator_of == student.division and user.staff.teacher_of_year == student.year %}
<tr>
<td style="color:white;"><input type="hidden" name="student_name" value="{{student.id}}" >{{student.user}}</td>
<td style="color:white;">{{student.roll_no}}</td>
<td style="color:white;">{{student.user.first_name}}</td>
<td style="color:white;">{{student.user.last_name}}</td>
<td style="color:white;">{{student.year}}</td>
<td style="color:white;">{{student.division}}</td>
<td style="color:white;">{{student.batch}}</td>
<td>
<div class="form-group">
<select class="btn btn-success" name="status" id="status">
<option selected value="Present">Present</option>
<option value="Absent">Absent</option>
</select>
</div>
</td>
</tr>
{% endif %}
{% endfor %}
</tbody>
</table>
<div class="form-group">
<button type="submit" class="btn btn-info btn-lg ">Add</button>
</div>
</form>
</div>
views.py
def takeattendance(request):
if request.method == "POST":
subject = Subject.objects.get(id=request.POST['subject'])
student = Student.objects.get(id=request.POST['student_name'])
status = request.POST['status']
print(subject)
print(student)
print(status)
attendance = Attendance(subject=subject, student=student, status=status)
attendance.save();
if request.user.is_authenticated and request.user.user_type==2:
return render(request,'ms/hod/Attendance.html')
if request.user.is_authenticated and request.user.user_type==3:
return render(request,'ms/staff/Attendance.html')
else:
return HttpResponse("Failed")
else:
return HttpResponse("Failed")
Приведенный выше код работает отлично, но получает только данные последней строки, тогда как мне нужны все строки и посещаемость каждого студента каждой строки
Используйте .getlist()
, если вы хотите получить несколько данных из одного ключа
Пример 1
def takeattendance(request):
if request.method == "POST":
subject = Subject.objects.get(id=request.POST['subject'])
student_ids = request.POST.getlist('student_name')
status = request.POST['status']
for sid in student_ids:
Attendance.objects.create(
subject=subject,
student=Student.objects.get(id=sid),
status=status
)
if request.user.is_authenticated and request.user.user_type == 2:
return render(request,'ms/hod/Attendance.html')
if request.user.is_authenticated and request.user.user_type == 3:
return render(request,'ms/staff/Attendance.html')
else:
return HttpResponse("Failed")
else:
return HttpResponse("Failed")
приведенный выше код будет работать нормально, но он будет бить базу данных на каждой итерации, чтобы решить это, вы можете использовать .bulk_create()
Пример 2
def takeattendance(request):
if request.method == "POST":
subject = Subject.objects.get(id=request.POST['subject'])
student_ids = request.POST.getlist('student_name')
status = request.POST['status']
attendance_objs = []
for sid in student_ids:
attendance_objs.append(
Attendance(
subject=subject,
student=Student.objects.get(id=sid),
status=status
)
)
Attendance.objects.bulk_create(
attendance_objs
)
if request.user.is_authenticated and request.user.user_type == 2:
return render(request,'ms/hod/Attendance.html')
if request.user.is_authenticated and request.user.user_type == 3:
return render(request,'ms/staff/Attendance.html')
else:
return HttpResponse("Failed")
else:
return HttpResponse("Failed")
Примечание
Перед использованием
bulk_create()
я предлагаю вам ознакомиться с некоторыми предостережения.bulk_create()