You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django模板中渲染多对多字段?实现点击课程显示关联主题

实现课程点击跳转至对应主题列表的完整方案

1. 修正视图函数的问题

你的course_topic视图中,获取关联主题的代码缺少调用括号,会导致模板无法正确遍历主题集合,修改如下:

def course_topic(request,pk):
  course = Course.objects.get(id=pk)
  # 调用all()方法获取实际的主题查询集
  topic_list = course.related_topic.all()
  context = {'course': course, 'topic_list': topic_list}
  return render(request, 'upskill/course_topic.html',context)

这里将变量名修改为更具语义化的名称,同时把当前课程对象传入模板,方便页面展示课程名称等信息。

2. 配置URL路由

在对应app的urls.py中添加两个路由,分别对应课程列表页和课程主题页:

from django.urls import path
from . import views

urlpatterns = [
    # 课程列表页路由
    path('courses/', views.view_course, name='view_course'),
    # 课程主题页路由,pk为课程ID参数
    path('courses/<int:pk>/topics/', views.course_topic, name='course_topic'),
]

3. 编写课程列表模板(view_course.html)

遍历所有课程,为每个课程添加跳转链接,指向对应的主题列表页:

<h1>所有课程</h1>
<div class="course-list">
  {% for course in course_list %}
    <div class="course-item">
      <!-- 显示课程图片(如果存在) -->
      {% if course.course_image %}
        <img src="{{ course.course_image.url }}" alt="{{ course.course_name }}">
      {% endif %}
      <!-- 点击课程名称跳转至对应主题页 -->
      <a href="{% url 'course_topic' course.id %}">{{ course.course_name }}</a>
    </div>
  {% empty %}
    <p>暂无课程</p>
  {% endfor %}
</div>

4. 编写课程主题列表模板(course_topic.html)

展示当前课程名称及所有关联主题:

<h1>{{ course.course_name }} 的主题列表</h1>
<div class="topic-list">
  {% for topic in topic_list %}
    <div class="topic-item">
      <h3>{{ topic.topic_name }}</h3>
      <!-- 如果有主题文件,添加下载链接 -->
      {% if topic.topic_file %}
        <a href="{{ topic.topic_file.url }}" download>下载主题资料</a>
      {% endif %}
    </div>
  {% empty %}
    <p>该课程暂无关联主题</p>
  {% endfor %}
</div>
<!-- 返回课程列表的链接 -->
<a href="{% url 'view_course' %}">返回课程列表</a>

额外注意事项

  • 若使用了ImageField和FileField,需配置媒体文件服务:
    在项目settings.py中添加:
    MEDIA_URL = '/media/'
    MEDIA_ROOT = BASE_DIR / 'media'
    
    并在项目urls.py中补充媒体路由:
    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
  • 为避免无效ID报错,可改用get_object_or_404:
    from django.shortcuts import get_object_or_404
    
    def course_topic(request,pk):
      course = get_object_or_404(Course, id=pk)
      topic_list = course.related_topic.all()
      context = {'course': course, 'topic_list': topic_list}
      return render(request, 'upskill/course_topic.html',context)
    

内容的提问来源于stack exchange,提问作者cyborg_upskill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:27:30