Django 路由层
简单路由配置
url(r'^admin/',admin.site.urls),
url(r'^admin/(?P<id>\d+.html)',views.admin),
第一个参数是正则表达式(如果要精确匹配 ‘^admin/$’),第二个参数是视图函数(不能加括号)
无名分组
按位置传参,分组之后,会把分组出来的数据,当位置参数,传到视图函数中,所以,视图函数需要定义形参
url(r'^login/([0-9]{4})/([0-9]{2})$',views.login), #urls.py文件内配置
def login(request,num1,num2): #views视图函数可以这样接收
有名分组
按关键字传参,有名分组之后会把分组出来的数据,当关键字参数,传到视图函数中,所以,视图函数需要定义形参,形参名字要和分组的名字对应,与顺序无关
url(r'^publish/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publish),
def publish(request, mounth,year):
有名分组和无名分组 不能混用
反向解析
反向解析基本用于路由重定向,当出现大量的路由需要配置的时候可以使用反向解析一条语句就可以解决,用于:例如图书展示当点击图书进入新的页面进行展示但是路由只需要 1 2 3...进行匹配的时候就可以反向解析不需要路由重新配置
先在urls里命一个名:
1 无参数:url(r'^publishadd133/$', views.publishadd,name='ddd'),
2 无名分组:url(r'^publishadd/([0-9]{4})/([0-9]{2})/$', views.publishadd,name='ddd'),
3 有名分组:url(r'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$',views.publishadd,name='ddd'),
在模板层:
1 无参数:<a href="{% url 'ddd' %}">点我</a>
2 无名分组的:<a href="{% url 'ddd' 2018 12 %}">点我</a>
3 有名分组:<a href="{% url 'ddd' 2018 12 %}">点我</a>
还可以 <a href="{% url 'ddd' year=2018 mounth=12 %}">点我</a>
在视图层:
from django.shortcuts import reverse
在视图函数里:
1 无参数:url=reverse('ddd')
1 无名分组:url=reverse('ddd',args=(2018,12,))
1 有名分组:url=reverse('ddd',args=(2018,12,)) 还可以 url=reverse('ddd',kwargs={'year':2018,'mounth':12})
return redirect(url)
路由分发
1 在不同的app里创建urls.py
①app01内urls.py
url(r'^publish/$', views.publishadd,name='app01_test'),
②blog内urls.py
url(r'^blogtest/$', views.test,name='test'),
2 在总路由
from django.conf.urls import include
url(r'^blog/',include('blog.urls')),
url(r'^app01/',include('app01.urls')),
3 在不同的app的urls里配置路由关系
***重点***总路由,不能加结束符$
名称空间
名称空间的一般是因为反向解析的name命名重叠,在urls总路由内用namespace配置
如果使用名称空间,反向解析的视图层和模板层都应该修改
6 名称空间
url(r'^blog/',include('blog.urls',namespace='blog')),
子路由:url(r'^publish/$', views.publish,name='test'),
反向解析:
视图层:url = reverse('blog:test')
模板层:{% url 'blog:test'%}
***不建议使用名称空间***
如下面的语句直接在反向解析的时候规范命名就可以
子路由:url(r'^publish/$', views.publish,name='app01_test'),
伪静态
路由:url(r'^book/(?P<id>\d+.html)',views.book),
访问:http://127.0.0.1:8000/book/4.html