Django报错:Reverse for 'plan_edit'带空pk参数未找到匹配路由求助
解决Django Reverse for 'plan_edit' 错误的方案
这个报错本质是URL路由配置不匹配+模板变量传递错误导致的,我给你一步步拆解问题并给出修复方案:
1. 修正URL路由,添加PK参数捕获
你的plan_edit路由规则没有接收pk参数,但edit视图明确需要pk来获取对应的Planning对象,这是核心问题之一。
当前错误的路由:
url(r'^palan/edit$', views.edit, name='plan_edit'),
修改为带PK捕获的规则,让Django能把PK值传递给视图:
url(r'^palan/(?P<pk>[0-9]+)/edit/$', views.edit, name='plan_edit'),
这样路由就能匹配palan/123/edit/这类请求,同时自动把pk=123传给edit视图。
2. 修复模板中的变量名错误
在palan_detail.html里,你写了pk=post.pk,但这个模板的上下文变量是palan(从palan_detail视图传递的{'palan': palan, ...}),根本不存在post变量,导致传递的PK是空字符串,反向解析URL时自然找不到匹配的路由。
修改模板代码:
<a href="{% url 'plan_edit' pk=palan.pk %}"> <h1>{{ palan.parcours }}</h1> </a>
这样就能正确传递当前palan对象的PK值了。
3. 完善Edit视图的GET请求逻辑
当用户以GET请求访问编辑页面时,你没有初始化表单并传递给模板,会导致后续渲染表单时出现新错误。修正后的视图代码:
def edit(request, pk): post = get_object_or_404(Planning, pk=pk) if request.method == "POST": form = PostFormP(request.POST, instance=post) if form.is_valid(): post = form.save(commit=False) post.author = request.user post.published_date = timezone.now() post.save() return redirect('palan_detail', pk=post.pk) else: # 初始化表单并传递给模板 form = PostFormP(instance=post) return render(request, 'pages/plan_edit.html', {'form': form})
额外提醒:保持拼写一致性
注意到你代码里存在palan/plan拼写混用的情况(比如路由名plan_edit,视图名plani_new),尽量统一拼写,避免后续出现其他混淆问题。
按以上步骤修改后,这个反向解析的错误应该就能解决了。
内容的提问来源于stack exchange,提问作者lamia
相关产品推荐
相关产品推荐

