Как отобразить данные полей "многие ко многим" в шаблоне Django

У меня получается вывести список всех курсов и список тем, соответствующих курсам в разных шаблонах.

Мне нужна помощь в просмотре списка всех курсов и при нажатии на каждый курс, на новой странице должен отображаться список связанных тем


models.py

class Topic(models.Model):

  topic_name = models.CharField(max_length=200, null=True)
  topic_file = models.FileField(upload_to = "topic_file", blank=True, null=True)

  def __str__(self):
        return self.topic_name

class Course(models.Model):
  course_name = models.CharField(max_length=200, null=True)
  course_image = models.ImageField(upload_to="images", blank=True, null=True)
  related_topic = models.ManyToManyField(Topic)
 
  def __str__(self):
        return self.course_name

Views.py

def view_course(request):
  course_list = Course.objects.all()
  context = {'course_list':course_list}
  return render(request, 'upskill/view_course.html',context)

def course_topic(request,pk):
  course_topic_list = Course.objects.get(id=pk)
  var = course_topic_list.related_topic.all 
  context = {'var':var}
  return render(request, 'upskill/course_topic.html',context)

Вот как можно получить связанные темы внутри шаблона.

{% for course in course_list %}
    ... data
    {% for topic in course.related_topic.all %}
        ...data
    {% endfor %}
{% endfor %}

Если вы не хотите выполнять запрос на каждой итерации цикла {{course}}, я рекомендую вам сделать это в ваших представлениях:

course_list = Course.objects.all().prefetch_related('related_topic')

А для одного объекта:

def course_topic(request,pk):
  course = Course.objects.prefetch_related('related_topic').get(id=pk)
  context = {'course ':course }
  return render(request, 'upskill/course_topic.html',context)

А затем в шаблоне:

{{course.data...}}
{% for topic in course.related_topic.all %}
    ...data
{% endfor %}
Вернуться на верх