Django之反向解析
阿新 • • 發佈:2022-03-01
反向解析
# 通過一些方法得到一個結果,該結果可以直接訪問對應的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,)))