Django多Slug URL反向匹配失败问题求助
搞定Django博客的NoReverseMatch错误!
嘿,我来帮你解决这个烦人的反向解析错误问题~ 先看错误提示:NoReverseMatch,说找不到带空参数的getPost路由,这说明咱们在反向生成URL的时候,categoryTypeSlug和postTitleSlug这俩参数是空的,或者路由配置本身有问题。咱们一步步来排查:
1. 先把URL配置的坑填上
首先检查你的urls.py,你现在的路由模式是['categories/(?P[\w\-]+)/(?P[\w\-]+)/$'],这里有个致命问题:正则捕获组没命名!Django反向解析需要知道每个捕获组对应的参数名,所以得改成下面这样:
推荐用path写法(更简洁)
from django.urls import path from . import views urlpatterns = [ # 其他路由... path('categories/<slug:categoryTypeSlug>/<slug:postTitleSlug>/', views.getPost, name='getPost'), ]
如果用正则的re_path写法
from django.urls import re_path from . import views urlpatterns = [ # 其他路由... re_path(r'^categories/(?P<categoryTypeSlug>[\w\-]+)/(?P<postTitleSlug>[\w\-]+)/$', views.getPost, name='getPost'), ]
划重点:原来的
(?P[\w\-]+)要改成(?P<参数名>正则)的格式,这样反向解析时才能对应上你传的关键字参数。
2. 确保模板里的参数不是空的
接下来看你的模板代码,你调用{% url 'getPost' ... %}的时候,传递的categoryTypeSlug和postTitleSlug对应的变量可能是空的。比如你大概是这么写的:
{% for post in posts %} <a href="{% url 'getPost' categoryTypeSlug=post.category.slug postTitleSlug=post.slug %}">{{ post.title }}</a> {% endfor %}
这时候要检查:
- 你的
Post和Category模型有没有slug字段?创建文章和分类的时候,是不是用slugify生成了有效的slug(比如不能是空字符串)? - 有没有文章没关联分类?如果有的话,
post.category.slug就会是空的,这时候得加个判断避免报错:
{% for post in posts %} {% if post.category and post.slug %} <a href="{% url 'getPost' categoryTypeSlug=post.category.slug postTitleSlug=post.slug %}">{{ post.title }}</a> {% else %} {{ post.title }}(暂时无法查看) {% endif %} {% endfor %}
3. 核对视图函数的参数名
最后检查你的getPost视图,确保它接收的参数名和URL里的命名完全一致,比如:
from django.shortcuts import get_object_or_404, render from .models import Post, Category def getPost(request, categoryTypeSlug, postTitleSlug): # 根据slug拿到分类和对应的文章 category = get_object_or_404(Category, slug=categoryTypeSlug) post = get_object_or_404(Post, slug=postTitleSlug, category=category) return render(request, 'post_detail.html', {'post': post, 'category': category})
最后一步:重启服务器测试
有时候Django的缓存会搞事情,改完配置后记得重启一下开发服务器,然后刷新页面看看~
按照这几步来,应该就能解决这个反向解析的问题啦!
内容的提问来源于stack exchange,提问作者ML_Engine
相关产品推荐
相关产品推荐

