1. 程式人生 > >Django進階-路由系統

Django進階-路由系統

名稱 object rect 技術 現在 mat 參數 對象 一個

概述

URL配置就像Django所支撐網站的目錄
本質:URL與視圖函數的映射表

Django2.0

from django.urls import path
url 換成了 path

基本格式

from django.conf.urls import url

urlpatterns = [
     url(正則表達式, views視圖函數,參數,別名),
]
正則表達式:        一個正則表達式字符串
views視圖函數:        一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串
參數:                可選的要傳遞給視圖函數的默認參數(字典形式)
別名:                一個可選的name參數

通過URL給視圖函數傳參

分組匹配和分組命名匹配, 一個正則規則裏只能選一個

通過?傳值

<a href="/del_publisher/?id={{ publisher.id }}" class="btn btn-danger">刪除</a>

取值

request.GET.get("id", None)
技術分享圖片
def del_publisher(request):
    print(request.GET)
    del_id = request.GET.get("id", None)        # 獲取到用戶要刪除的數據的ID
    if del_id:
        del_obj 
= models.Publisher.objects.get(id=del_id) # 找到要刪除的那條數據 del_obj.delete() # 刪除找到的那條數據 return redirect("/publisher_list/") # 返回到出版社列表的頁面 else: return HttpResponse("找不到要刪除的數據")
views

分組匹配(按位置傳)

url(r^test30/([a-zA-Z]+)/(\d+)/$, views.test20)

視圖函數裏按照位置接收

技術分享圖片
def test20(request, name, id):        #
name是第一個分組, id是第二個分組 return HttpResponse("name:{} id:{}".format(name, id))
views.py

分組命名匹配

url(r^test20/(?P<name>[a-zA-Z]+)/(?P<id>\d+)/$, views.test20)

視圖函數裏按照關鍵字接收

技術分享圖片
def test20(request, name, id):        # name是第一個分組, id是第二個分組(這裏的name,id反過來寫也無所謂)
    return HttpResponse("name:{} id:{}".format(name, id))
views.py

視圖函數中指定默認值

# urls.py中
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r^blog/$, views.page),                        # 當匹配到這個URL的時候,去做默認值的操作
    url(r^blog/page(?P<num>[0-9]+)/$, views.page),    # 當匹配到這個URL的時候,去做獲取的到num相關的操作
]

# views.py中,可以為num指定默認值
def page(request, num="1"):
    pass

通過對應關系給視圖函數傳參

url(r^test40/([a-zA-Z]+)/(\d+)/$, views.test40, {"age": 998})

視圖函數裏按照關鍵字接收

技術分享圖片
def test40(request, name, id, age):        # name id 是按照分組傳進來的 age 是通過對應關系傳進來的
    return HttpResponse("name:{} id:{} age:{}".format(name, id, age))
views.py

命名URL和URL反向解析

本質上就是給url匹配模式起【別名】,然後url跳轉時(a標簽/重定向)用過別名拿到具體的URL路徑

1, 不帶參數版本

url(r^home, views.home, name=home),          # 給我的url匹配模式起名為 home

在模板裏引用

{% url home %}

在views視圖裏引用

from django.urls import reverse

reverse("index")

2, 帶參數版本

url(r^index/(\d*), views.index, name=index),          # 給我的url匹配模式起名為index

在模板裏引用

{% url index 實參1 實參2 %}

在views視圖裏引用

from django.urls import reverse

# 按位置傳的參數
reverse("index", args=("實參1", "實參2", ...))

# 按關鍵字傳的參數
reverse("index", kwargs={"形參1": "實參1", "形參2": "實參2", "形參3": "實參3"}, ...)

命令空間

即使不同的APP使用相同的URL【別名】,URL的命名空間模式也可以讓你唯一反轉命名的URL。

例子

project中的urls.py

from django.conf.urls import url, include
import app01
import app02

urlpatterns = [
    url(r^app01/, include(app01.urls, namespace=app01)),
    url(r^app02/, include(app02.urls, namespace=app02)),
]

app01中的urls.py

from django.conf.urls import url
from app01 import views
 
app_name = app01
urlpatterns = [
    url(r^(?P<pk>\d+)/$, views.detail, name=detail)
]

app02中的urls.py

from django.conf.urls import url
from app02 import views
 
app_name = app02
urlpatterns = [
    url(r^(?P<pk>\d+)/$, views.detail, name=detail)
]

現在,我的兩個app中 url名稱重復了,我反轉URL的時候就可以通過命名空間的名稱得到我當前的URL。

語法:  ‘命名空間名稱:URL名稱‘  

模板中使用

{% url app01:detail pk=12 pp=99 %}

views中的函數中使用

v = reverse(app01:detail, kwargs={pk:11})

Django進階-路由系統