无名分组、有名分组、反向解析、路由分发、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 ,类中函数名必须小写。