反向解析
# 通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数
模拟演示:
urls.py
urlpatterns = [
url(r'^$',views.home), # 首页
url(r'^func/',views.func) # 路由后缀func
]
views.py
def home(request): # 视图函数home首页 返回一个html页面
return render(request,'home.html')
def func(request):
return HttpResponse('func') # func路由后缀返回一个字符串func
home.html
<body>
<a href="/func/">func</a> <!--建立a标签重定向到func视图函数-->
<a href="/func/">func1</a>
<a href="/func/">func2</a>
<a href="/func/">func3</a>
<a href="/func/">func4</a>
<a href="/func/">func5</a>
<a href="/func/">func6</a>
<a href="/func/">func7</a>
</body>
上述逻辑:主页面为很多a标签,点击a标签会跳转到路由后缀为func,返回一个字符串'func'
那么如果路由层的路由后缀换了,不是func这样就会导致整个html页面的a标签失效。
# 现在将路由与视图函数路由后缀换了:
urlpatterns = [
url(r'^$',views.home), # 首页
url(r'^func_new/',views.func) # 路由后缀func
]
# 这样是不是a标签都作废了,因为a标签访问的还是/func/,但是现在已经换成了/func_new/
# 解决方式一:
无非是吧整个页面的a标签的href属性在改一下,那这样用膝盖也能想到是非常麻烦的。
反向解析:
# 解决方式二:反向解析
1、先给路由与视图函数起一个别名
url(r'^func_new',view.func,name='hhh') # 在路由层添加name属性
2、反向解析
# 后端反向解析
from django.shortcuts import render,HttpResponse,redirect,reverse
reverse('hhh') # 反向解析
# 前端反向解析
<a href="{% url 'hhh' %}">func</a>
# 注:别名不可以冲突
有名分组与无名分组反向解析
无名分组:
urls.py
# 不使用任何分组
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$',views.home),
url(r'^index/123132/',views.index,name='xxx')
]
# 我们可以看到在不使用分组的时候,后端的反向解析会直接拿到对用的路由因为是固定的
# 无名分组
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$',views.home),
url(r'^index/(\d+)/',views.index,name='xxx') # 无名分组反向解析
]
# 但是我们现在使用无名分组,后端是无法接收到对应的路由的,因为根本就不确定第二个路由到底是什么
views.py
def home(request):
print(reverse('xxx',args='1')) # 这里必须给一个数可以匹配到路由曾的(\d+)
return render(request,'home.html')
def index(request,args):
return HttpResponse('index')
# 这里只是演示了用法,这里通常放的是数据的主键值,来做数据的编辑和删除
前端反向解析:
<a href="{% url 'xxx' 111 %}"></a>
有名分组
# 有名分组反向解析
url(r'^func/(?P<year>\d+)/',views.func,name='ooo')
# 前端
<a href="{% url 'ooo' year=123 %}">111</a> # 中规中矩的写法(了解)
<a href="{% url 'ooo' 123 %}">222</a> # 也可以简写为
# 后端
# 有名分组反向解析写法1:
print(reverse('ooo',kwargs={'year':123}))
# 简写的方式:
print(reverse('ooo',args=(111,)))