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

Django跳转课程模块页报缺少id参数TypeError问题

报错原因

TypeError: modules_page() missing 1 required positional argument: 'id'的触发原因非常明确:

  • 你的modules_page视图函数定义了必须传入id位置参数
  • 模板中反向解析路由时也确实传入了course.id作为参数
  • 但urls.py中配置的modules路由没有声明路径参数占位符,Django匹配路由时无法获取要传递给视图的id值,直接抛出参数缺失错误。
修复方案

按以下顺序修改代码即可解决问题:

  • 修改路由配置
    打开urls.py,给modules路由加上int类型的id路径参数,和项目内其他带id的路由规则保持一致:

    # 把原来的path("modules", views.modules_page, name="modules_page") 替换为
    path("modules/<int:id>", views.modules_page, name="modules_page"), 
    

    用<int:id>而不是<str:id>是因为课程id默认是自增整数,转换器会自动过滤非数字的非法id请求,减少异常。

  • 修正视图逻辑bug
    你当前视图里ended = Course.ended的写法是错的,这行拿到的是Course模型的字段定义对象,不是当前课程的完结状态,另外直接用objects.get()取数据遇到不存在的id会返回500错误,建议替换为Django内置的404快捷方法:
    首先在views.py顶部导入依赖:

    from django.shortcuts import render, get_object_or_404
    

    然后修改modules_page视图:

    def modules_page(request, id):
        if not request.user.is_authenticated:
            return render(request, "auctions/login.html")   
        # id不存在时直接返回404页面,避免500报错
        course = get_object_or_404(Course, id=id)
        ended = course.ended
        # 按课程实际状态返回提示文本
        course_ended_tip = "Course has ended." if ended else ""
        return render(request, "auctions/modules_page.html", {
            "course": course,
            "course_ended": course_ended_tip,
            "commentform": CommentForm()
        })
    
  • 补全模板标签闭合
    你贴出的模板代码存在标签未闭合的问题:<ul>标签开了没关、循环结构的标签嵌套混乱,会触发模板渲染错误,调整为结构完整的写法即可:

    <!-- Modules -->
    <h3>
      <span class="badge badge-secondary badge-pill mx-1">{{ course.modules.count }}</span>
      <a href="{% url 'modules_page' course.id %}">Modules:</a>
    </h3>
    {% for module in course.modules.all %}
    <div class="card p-1 m-2 col-lg-12 col-sm-12">
      <div class="card-body">
          <h4 class="card-title"><a href="{% url 'module' module.id %}">{{ module.title }}</a></h4>
          <h6 class="card-subtitle mb-2 text-muted">{{ module.creation_date }}</h6>
          <h6>{{ module.description }}</h6>
      </div>
    </div>
    {% endfor %}
    

改完之后重启Django服务,点击课程页的Modules链接就能正常跳转到对应课程的模块列表页了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:54:21