Django访问文章详情页跳转article_edit报NoReverseMatch错如何解决?
问题原因
报错核心是模板中调用{% url 'article_edit' article.pk %}时,article这个变量在DetailView的默认上下文中不存在,所以article.pk取值为空,传入url路由的参数是空字符串,和你定义的需要整数pk的路由规则匹配不上,触发NoReverseMatch错误。
Django的泛型DetailView默认会给模板传递两个上下文变量:
- 固定变量名
object,对应当前查询到的单条数据 - 变量名为model类名的小写形式,你的model类是
Articles,所以默认的变量名是articles而不是article
解决方法
你可以任选以下任意一种方案修复:
方案1:直接修改模板变量名
把article_detail.html里的链接部分的article.pk替换为已经在使用的object.pk即可,同时修复下方文章列表链接的文本错位问题:
<p> <a href="{% url 'article_edit' object.pk %}">Edit</a> | <a href="{% url 'article_delete' object.pk %}">Delete</a> </p> <p>back to <a href="{% url 'article_list' %}">All Articles</a></p>
方案2:指定上下文变量名
在ArticleDetailView中添加context_object_name参数,主动指定上下文变量名为article,这样你原来的模板代码不用改:
class ArticleDetailView(DetailView): model = Articles template_name = "article_detail.html" context_object_name = "article" # 新增这行
额外需要修复的隐性问题
你现在的代码还有两处隐藏bug,建议一并修复:
views.py中的ArticleDeleteView的success_url定义缺少右括号,修改为:
success_url = reverse_lazy("article_list")
- 你的model类名用了复数
Articles,不符合Django的命名规范,建议改为单数Article,避免后续上下文变量名、后台展示等场景出现不必要的歧义。
内容的提问来源于stack exchange,提问作者Saif789
相关产品推荐
相关产品推荐

