Проблемы с получением данных из таблицы, которая использует 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()

Вернуться на верх