無名分組、有名分組、反向解析、路由分發、FBV與CBVhtml
無名分組(將加括號的正則表達式匹配到的內容當作位置參數自動傳遞給對應的視圖函數)
前端
url(r'^test/(\d+)/',views.test), # 匹配一個或多個數字 def test(request,xxx): print(xxx) return HttpResponse('test')
有名分組(將加括號的正則表達式匹配到的內容當作關鍵字參數自動傳遞給對應的視圖函數)
正則表達式
url(r'^test/(?P<year>\d+)/',views.test), # 匹配一個或多個數字 def test(request,year): print(year) return HttpResponse('test')
注意:無名分組和有名分組不能混着用!!!
url(r'^test/(\d+)/(?P<year>\d+)/',views.test)
可是支持用一類型多個形式匹配
django
無名分組多個 url(r'^test/(\d+)/(\d+)/',views.test), 有名分組多個 url(r'^test/(?P<year>\d+)/(?P<xxx>\d+)/',views.test),
反向解析:(根據名字動態獲取到對應路徑)後端
from django.shortcuts import reverse url(r'^index6668888/$',views.index,name='index') # 能夠給每個路由與視圖函數對應關係起一個名字 # 這個名字可以惟一標識出對應的路徑 # 注意這個名字不能重複是惟一的 前端使用 {% url 'index' %} {% url '你給路由與視圖函數對應關係起的別名' %} 後端使用 reverse('index') reverse('你給路由與視圖函數對應關係起的別名')
無名分組反向解析app
url(r'^test/(\d+)/',views.test,name='list')
後端使用 print(reverse('list',args=(10,)))
前端使用 {% url 'list' 10 %} user_list = models.User.objects.all()
url(r'^edit/(\d+)/',views.edit,name='edit')
前端模板語法 {%for user_obj in user_list%} <a href='edit/{{ user_obj.pk }}/'></a> {% endfor %} 視圖函數 from django.shortcuts import reverse def edit(request,edit_id): url = reverse('edit',args=(edit_id,)) 模板 {% url 'edit' edit_id %}
有名分組反向解析函數
後端使用 # 後端有名分組和無名分組均可以用這種形式 print(reverse('list',args=(10,)))
# 下面這個瞭解便可 print(reverse('list',kwargs={'year':10}))
前端使用
# 前端有名分組和無名分組均可以用這種形式 {% url 'list' 10 %} # 下面這個瞭解便可 {% url 'list' year=10 %}
總結:針對有名分組與無名分組的反向解析統一採用一種格式便可post
後端 reverse('list',args=(10,)) # 這裏的數字一般都是數據的主鍵值 前端 {% url 'list' 10 %}
# 反向解析的本質:就是獲取到一個可以訪問名字所對應的視圖函數
路由分發url
django每個app下面均可以有本身的urls.py路由層,templates文件夾,static文件夾 項目名下urls.py(總路由)再也不作路由與視圖函數的匹配關係而是作路由的分發
from django.conf.urls import include # 路由分發 注意路由分發總路由千萬不要$結尾
url(r'^app01/',include('app01.urls')), url(r'^app02/',include('app02.urls')) # 在應用下新建urls.py文件,在該文件內寫路由與視圖函數的對應關係便可
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/',views.index) ]
注意:在這裏要注意路由分發和反向解析同時用是,分發的路由雖然在不一樣的app中,spa
可是反向解析的name也不要去相同的名字,不然會出現覆蓋現象。
例:咱們在總路由下新建兩條路由
分別分發到我已經建好的兩個app,app01和app02中,在app01和02中新建urls.py文件,
取相同的名字,Index,這時咱們在views文件中進行反向解析
咱們獲得輸出結果都是app02,那麼01已經被覆蓋了。
FBV與CBV
FBV(function base views) 就是在視圖裏使用函數處理請求。
urls.py
from django.conf.urls import url, include # from django.contrib import admin from mytest import views urlpatterns = [ # url(r‘^admin/‘, admin.site.urls), url(r‘^index/‘, views.index), ]
views.py
from django.shortcuts import render def index(req): if req.method == ‘POST‘: print(‘method is :‘ + req.method) elif req.method == ‘GET‘: print(‘method is :‘ + req.method) return render(req, ‘index.html‘)
CBV(class base views) 就是在視圖裏使用類處理請求。
urls.py
from mytest import views urlpatterns = [ # url(r‘^index/‘, views.index), url(r‘^index/‘, views.Index.as_view()), ]
注:url(r‘^index/‘, views.Index.as_view()), 是固定用法。
views.py
from django.views import View class Index(View): def get(self, req): print(‘method is :‘ + req.method) return render(req, ‘index.html‘) def post(self, req): print(‘method is :‘ + req.method) return render(req, ‘index.html‘)
注:類要繼承 View ,類中函數名必須小寫。