添加app_name='blog'后遭遇add_comment反向解析失败问题求助
嘿,这个错误其实很典型,咱们一步步拆解解决:
首先抓准错误信息的核心:
Reverse for 'add_comment' with keyword arguments '{u'slug': None}' not found. 尝试的匹配模式为[u'blog/(?P
\d+)/comment/$']
问题根源很明确:你在生成add_comment的URL时,传递了slug参数(而且这个值还是None),但你的URL配置里定义的是接收pk参数(数字类型),两者完全不匹配,所以Django找不到对应的路由。
接下来咱们逐个检查相关文件:
1. 检查模板add_comment.html中的URL调用
你大概率在模板里写了类似这样的代码:
{% url 'blog:add_comment' slug=post.slug %}
但根据你的URL规则,应该改成传递pk参数:
{% url 'blog:add_comment' pk=post.pk %}
同时要确保post对象是有效的(不是None)——比如渲染模板的视图里,已经通过get_object_or_404之类的方法正确获取了Post实例并传递给模板。
2. 检查views.py中的reverse调用
如果你的视图里用reverse生成跳转URL,比如:
return redirect(reverse('blog:add_comment', kwargs={'slug': post.slug}))
同样要把参数改成pk:
return redirect(reverse('blog:add_comment', kwargs={'pk': post.pk}))
这里也要确认post实例存在,避免因为post为None导致pk为空的情况。
3. 确认urls.py的配置正确性
你的URL配置方向是对的,再核对一下add_comment的条目:
# blog/urls.py app_name = 'blog' urlpatterns = [ # ...其他URL规则 path('<int:pk>/comment/', views.add_comment, name='add_comment'), # 如果你用的是re_path写法:re_path(r'^(?P<pk>\d+)/comment/$', views.add_comment, name='add_comment'), ]
这里明确用了pk作为捕获的参数名,所以生成URL时必须传pk而不是slug。
额外排查:为什么slug会是None?
如果你的Post模型里slug字段允许为空,或者创建Post时没自动生成slug,就会导致post.slug为None。不过即使slug有值,你的URL规则也不需要它,所以重点还是切换到pk参数即可。
总结一下:把所有生成add_commentURL的地方,从传递slug改成传递pk,同时确保传递的pk对应有效的Post实例,这个错误就能解决啦。
内容的提问来源于stack exchange,提问作者user9405106

