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
相关产品推荐
相关产品推荐

