Django: данные из контекста не отображаются в шаблоне
я написал представление для отображения самых продаваемых курсов, а затем передал данные в context dict, чтобы иметь возможность получить доступ к ним в шаблоне, но при выполнении цикла forloop на наборе запросов данные в шаблоне не отображаются.
views.py
@login_required
def dashboard(request):
...
course_counts = UserCourse.objects.values("course").annotate(count=models.Count("course")).filter()
sorted_courses = sorted(course_counts, key=lambda x: x['count'],reverse=True)
context = {
'course_counts':course_counts,
'sorted_courses':sorted_courses,
}
return render(request, 'dashboard/dashboard.html', context)
dashboard.html
{% for course in sorted_courses %}
<h1>{{ course.course_title }}</h1>
{% endfor %}
models.py
class Course(models.Model):
course_title = models.CharField(max_length=100, null=True, blank=True)
course_creator = models.ForeignKey(User, on_delete=models.CASCADE)
class UserCourse(models.Model):
user = models.ForeignKey(User , null = False , on_delete=models.CASCADE)
course = models.ForeignKey(Course , null = False , on_delete=models.CASCADE, related_name="usercourse")
Когда вы вызвали .values()
, вы изменили объекты на QuerySet справочников с единственным course
ключом и его значением в поле с этим именем. В основном это выглядит так:
<QuerySet [{"course": "some value"}, {"course": "another value"}, {"course": "another value"} {...}]>
Затем вы создаете еще несколько вещей и пытаетесь управлять ими как объектами. Это не те объекты, которые вам нужны. Просто чтобы посмотреть, что там есть, попробуйте изменить этот цикл на:
{% for course in sorted_courses %}
<h1>{{ course }}</h1>
{% endfor %}
И я думаю, вы поймете остальное. Вы всегда можете вызвать значения словаря внутри цикла. Видя, что вы сделали, я предполагаю, что вы можете попробовать:
{{ course.course }}
# or
{{ course.count }}
Но я не думаю, что это было то, что вы хотели. Если вы хотите остаться с объектами базы данных, используйте методы .filter()
или .order_by()
. Но помните, что пустой метод .filter()
буквально ничего не делает.