Django点击详情链接触发NoReverseMatch错误求助
搞定NoReverseMatch错误:Reverse for 'detail' with arguments '('',)' not found
嘿,我来帮你定位并解决这个问题!这个错误的核心是:当你点击"SHOW DETAIL"链接时,模板尝试生成detail页面的URL,但传递的参数是空字符串,匹配不上要求传入数字主键的URL规则。
问题出在views.py的变量名写错了!
先看你的top视图函数:
def top(request): content = POST.objects.order_by('-created_at')[:5] page = _get_page(blog_content, request.GET.get('page')) # 这里有坑! return render(request, 'top.html',{'content':content,"page":page})
你明明把查询到的POST列表存在了content变量里,但调用分页函数_get_page时,却传入了一个根本没定义的blog_content!这就导致page对象根本没拿到正确的POST数据,模板循环里的content.pk自然是空值,URL反向解析就失败了。
一步步修复
修正视图里的变量名
把分页调用里的blog_content改成content,另外如果你想分页的话,建议去掉[:5](先取5条再分页没什么意义,分页会帮你控制每页显示数量):def top(request): # 获取所有POST,按创建时间倒序 post_list = POST.objects.order_by('-created_at') # 传入正确的查询集到分页函数 page = _get_page(post_list, request.GET.get('page')) # 只传递需要的page变量到模板就行 return render(request, 'top.html',{"page":page})优化模板里的循环变量名
把top.html里的循环变量从content改成post,避免和视图里的变量名混淆,更清晰:<div> {% for post in page %} <h2>{{ post.title }}</h2> <p><a href="{% url 'detail' post.pk %}">SHOW DETAIL</a></p> {% endfor %} </div>额外小提示
你在DetailView里已经指定了template_name='detail.html',所以urls.py里的views.DetailView.as_view(template_name='detail.html')可以简化成views.DetailView.as_view(),重复指定没必要,但这不是导致错误的原因。
这样修改后,点击链接时就能正确传递POST的主键值,成功跳转到详情页啦!
内容的提问来源于stack exchange,提问作者user7676799
相关产品推荐
相关产品推荐

