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() буквально ничего не делает.

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