Django使用{% url %}标签时报Reverse for 'build-log-delete'无参数匹配错误
问题根因
你在urls.py中定义的build-log-delete路由规则包含2个必填路径参数<int:pk>(对应关联的post id)和<int:pkz>(对应要删除的build log id),使用Django模板的{% url %}标签反向生成路由时,必须传入这两个参数才能拼接出合法的URL,你当前没有传参,所以触发了反向解析失败的报错。
修复步骤
1. 修改模板中的删除按钮链接
你当前页面的上下文已经传入了log对象,从中可以获取到两个参数的对应值,把删除按钮的href修改为:
<a class="delete-btn" href="{% url 'build-log-delete' pk=log.post_id pkz=log.pk %}">Delete</a>
如果要更严谨,也可以在BuildLogDisplay视图的context中加入路径参数pk,直接传参即可:
context = { 'post':post, 'log':log, 'pk':pk }
对应模板写法可以改成:
<a class="delete-btn" href="{% url 'build-log-delete' pk=pk pkz=log.pk %}">Delete</a>
2. 修正Delete视图的参数接收
你当前的BuildLogDelete视图没有对应接收路由传递的两个路径参数,需要修改视图定义:
def BuildLogDelete(request, pk, pkz): # 后续可以用pkz查询要删除的BuildLog对象,完成权限校验、删除逻辑 log = BuildLog.objects.get(pk=pkz) # 这里可以加作者校验,防止越权删除 if log.author != request.user: # 可自行补充无权限处理逻辑 pass context = { } return render(request, 'blog/BuildLogDelete.html', context)
补充说明
为什么必须传这两个参数?因为你的路由规则就是按「post id + build log id」的层级设计的,Django的反向路由解析逻辑要求你传入所有定义的动态路径参数,才能生成正确的请求地址,不然系统不知道你要删除哪条post下的哪条build log。
内容的提问来源于stack exchange,提问作者Wazy
相关产品推荐
相关产品推荐

