Отображение количества студентов, записавшихся на курсы, созданные преподавателем
Я создаю сайт, на котором преподаватель может создавать курсы, а студенты могут записываться на эти курсы. Я столкнулся с проблемой при отображении количества студентов, записавшихся на курсы, которые есть у преподавателя.
Я не уверен, как получить количество студентов, записавшихся на курсы, которые есть у преподавателя. Помогите пожалуйста 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)