Django中的路由层

无名分组、有名分组、反向解析、路由分发、FBV与CBV

 

    无名分组(将加括号的正则表达式匹配到的内容当做位置参数自动传递给对应的视图函数)

url(r'^test/(\d+)/',views.test),  # 匹配一个或多个数字

def test(request,xxx):
    print(xxx)
    return HttpResponse('test')
   


    有名分组(将加括号的正则表达式匹配到的内容当做关键字参数自动传递给对应的视图函数)

url(r'^test/(?P\d+)/',views.test),  # 匹配一个或多个数字
        
def test(request,year):
    print(year)
    return HttpResponse('test')

    
 注意:无名分组和有名分组不能混着用!!!
        url(r'^test/(\d+)/(?P\d+)/',views.test)
    
    
但是支持用一类型多个形式匹配

无名分组多个
    url(r'^test/(\d+)/(\d+)/',views.test),
有名分组多个
    url(r'^test/(?P\d+)/(?P\d+)/',views.test),

 

 

反向解析:(根据名字动态获取到对应路径)

from django.shortcuts import reverse

       url(r'^index6668888/$',views.index,name='index')

# 可以给每一个路由与视图函数对应关系起一个名字
# 这个名字能够唯一标识出对应的路径
# 注意这个名字不能重复是唯一的
        
    前端使用
        {% url 'index' %}
        {% url '你给路由与视图函数对应关系起的别名' %}
    
    后端使用
        reverse('index')
        reverse('你给路由与视图函数对应关系起的别名')

 

无名分组反向解析

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%} 'edit/{{ user_obj.pk }}/'> {% 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 %}

 


总结:针对有名分组与无名分组的反向解析统一采用一种格式即可

 

后端
     reverse('list',args=(10,))  # 这里的数字通常都是数据的主键值
前端
     {% url 'list' 10 %}
# 反向解析的本质:就是获取到一个能够访问名字所对应的视图函数

 

 

 

路由分发

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中,

但是反向解析的name也不要去相同的名字,否则会出现覆盖现象。

例:我们在总路由下新建两条路由

Django中的路由层_第1张图片

 

 分别分发到我已经建好的两个app,app01和app02中,在app01和02中新建urls.py文件,

Django中的路由层_第2张图片

 

取相同的名字,Index,这时我们在views文件中进行反向解析

Django中的路由层_第3张图片

 

 Django中的路由层_第4张图片

 

 我们得到输出结果都是app02,那么01已经被覆盖了。

Django中的路由层_第5张图片

 

 

 

 

 

 

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 ,类中函数名必须小写。

 

 

你可能感兴趣的:(Django中的路由层)