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

Django项目中<int:pk>路由与页面跳转问题求助

嘿,我来帮你排查这两个问题!你遇到的NoReverseMatch错误和列表页到详情页的链接问题,其实都是几个小细节没处理好,咱们一步步来解决:

1. 解决详情页的NoReverseMatch错误(核心问题)

你的SchoolDetailView重写了get方法,直接返回render,这跳过了Django DetailView默认的核心逻辑——自动根据URL里的pk从数据库获取对应School对象,并把它注入到模板上下文里。这就导致模板里的school_detail.pk是空值,反向解析update路由时找不到有效的pk参数,触发了错误。

修改views.py里的SchoolDetailView,删掉多余的自定义代码,让它用默认逻辑即可:

class SchoolDetailView(DetailView):
    context_object_name = 'school_detail'
    model = models.School
    # 删掉以下不需要的代码
    # query_pk_and_slug=True
    # def get(self, request, *args, **kwargs):
    #     return render(request,'basic_app/school_detail.html')

解释:DetailView会自动完成三件事:根据pk查询对象、把对象放到你指定的school_detail上下文变量里、默认渲染basic_app/school_detail.html模板,完全不需要手动重写get方法。另外query_pk_and_slug=True在这里也没用,因为你的路由只用到了pk,没有slug参数。

2. 修复列表页到详情页的链接问题

你的school_list.html里用了<a href="{{ school.id }}">,这会生成相对路径(比如当前在/basic_app/list/,点击后会跳到/basic_app/list/1/,而不是正确的/basic_app/1/)。推荐两种更可靠的写法:

方法一:用模型的get_absolute_url(推荐)

你已经在School模型里定义了这个方法,直接调用即可:

{% for school in school_list %}
<h2><li><a href="{{ school.get_absolute_url }}">{{school.name}}</a></li></h2>
{% endfor %}

方法二:用{% url %}模板标签

明确指定路由名称和参数,可读性更强:

{% for school in school_list %}
<h2><li><a href="{% url 'basic_app:detail' pk=school.pk %}">{{school.name}}</a></li></h2>
{% endfor %}

3. 额外检查:模板路径正确性

确保你的模板文件放在正确位置:templates/basic_app/school_list.html和templates/basic_app/school_detail.html,Django的类视图默认会按app名/模型名_视图类型.html的规则查找模板,你的路径是符合要求的,修复上面两个问题后就可以正常工作了。

现在把这些修改完成,重启开发服务器,应该就能正常从列表页跳转到详情页,并且详情页的Update链接也能正确解析了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:53:12