1. 程式人生 > 其它 >Django之反向解析

Django之反向解析

反向解析

# 通過一些方法得到一個結果,該結果可以直接訪問對應的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,)))