Django進階-路由系統
阿新 • • 發佈:2018-10-01
名稱 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_objviews= models.Publisher.objects.get(id=del_id) # 找到要刪除的那條數據 del_obj.delete() # 刪除找到的那條數據 return redirect("/publisher_list/") # 返回到出版社列表的頁面 else: return HttpResponse("找不到要刪除的數據")
分組匹配(按位置傳)
url(r‘^test30/([a-zA-Z]+)/(\d+)/$‘, views.test20)
視圖函數裏按照位置接收
def test20(request, name, id): #views.pyname是第一個分組, id是第二個分組 return HttpResponse("name:{} id:{}".format(name, id))
分組命名匹配
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進階-路由系統