Как отобразить данные полей "многие ко многим" в шаблоне 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 %}