Отображение количества студентов, записавшихся на курсы, созданные преподавателем

Я создаю сайт, на котором преподаватель может создавать курсы, а студенты могут записываться на эти курсы. Я столкнулся с проблемой при отображении количества студентов, записавшихся на курсы, которые есть у преподавателя.

Я не уверен, как получить количество студентов, записавшихся на курсы, которые есть у преподавателя. Помогите пожалуйста T.T

models.py

class Course(models.Model):
    user = models.ForeignKey(Users, on_delete = models.CASCADE)
    media = models.ImageField(upload_to = 'media/course')
    title = models.CharField(max_length=300, null = False)
    subtitle = models.CharField(max_length=500, null = False)
    description = models.TextField(max_length=5000, null = False)
    language = models.CharField(max_length=20, null = False, choices=LANGUAGE)
    level = models.CharField(max_length=20, null = False, choices=LEVEL)
    category = models.CharField(max_length=30, null = False, choices=CATEGORY)
    subcategory = models.CharField(max_length=20, null = False)
    price = models.FloatField(null = True)
    roles_responsibilities = models.TextField(max_length=2500, null = False)
    timeline_budget = models.TextField(max_length=250, null = False)
    req_prerequisite = models.TextField(max_length=2500, null = False)
    certificate = models.CharField(max_length=5, null = False, choices=CERTIFICATE)
    slug = AutoSlugField(populate_from='title', max_length=500, unique=True, null=True)

class Enrollment(models.Model):
    student = models.ForeignKey(User, on_delete=models.CASCADE)
    course = models.ForeignKey(Course, on_delete=models.CASCADE)

    def __str__(self):
       return "%s %s" % (self.student, self.course)

views.py

def instructorDashboard(request):
user = Users.objects.all()
user_id = Users.objects.get(user_id=request.user)
course = Course.objects.filter(user = user_id)
course_count = course.count()

context = {'user':user, 'course_count': course_count}
return render(request, 'instructor_dashboard/index.html', context)

index.html

<div class="col-xl-3 col-md-6 mb-4">
<div class="card border-left-warning shadow h-100 py-2">
    <div class="card-body">
        <div class="row no-gutters align-items-center">
            <div class="col mr-2">
                <div class="text-xs font-weight-bold text-warning text-uppercase mb-1">
                    Total Students</div>
                <div class="h5 mb-0 font-weight-bold text-gray-800">{{ student_count }}</div>
            </div>
            <div class="col-auto">
                <i class="fas fa-user fa-2x text-gray-300"></i>
            </div>
        </div>
    </div>
</div>

Это возможно с помощью обратного поиска связанных объектов.

Например, вы можете переписать свой класс Enrollment следующим образом, чтобы быть более вербальным с related_name (если вы не предоставите его, вы все равно можете получить доступ к тому же QuerySet с помощью FOO_set, где FOO - это имя исходной модели, написанное строчными буквами - я покажу это в примере кода ниже).

class Enrollment(models.Model):
    student = models.ForeignKey(User, on_delete=models.CASCADE)
    course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='enrollments')

Тогда вы должны иметь возможность получить QuerySet всех зачислений из заданного Course, например:

given_course = Course.objects.get(pk=1)
course_entrollments_num = given_course.enrollments.all().count()

Но если вам нужно использовать его в шаблоне, я думаю, вы должны быть в состоянии использовать что-то вроде этого:

views.py

def instructorDashboard(request):
    instructor = Users.objects.get(user_id=request.user)
    courses = instructor.course_set.all() # the same backward relationship but without provided 'related_name', that Django creates automatically

    context = { 'instructor': instructor, 'courses': courses }
    return render(request, 'instructor_dashboard/index.html', context)

index.html

{% for course in courses %}
<p>{{ course.title }} has {{ course.enrollments.all|length }}</p>
They are:
<ul>
{% for enrollment in course.enrollments.all %}
<li>{{ enrollment.student.name }}</li>
{% endfor %}
</ul>
{% endfor %}

Если вам нужно общее количество студентов всех курсов, то вы можете сделать что-то вроде этого

views.py

def instructorDashboard(request):
    instructor = Users.objects.get(user_id=request.user)
    courses = instructor.course_set.all() # the same backward relationship but without provided 'related_name', that Django creates automatically
    total_students = sum(course.enrollments.count() for course in courses)

    context = { 'instructor': instructor, 'courses': courses, 'total_students': total_students}
    return render(request, 'instructor_dashboard/index.html', context)
Вернуться на верх