设么是路由?
它的本质是URL与要为该URL调用的视图函数之间的映射表。
我们就是以这种方式告诉Django,遇到哪个URL的时候,要对应执行哪个函数。
基本格式:
from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图,参数,别名), ]
参数说明:
- 正则表达式:一个正则表达式字符串
- views视图:一个可调用对象,通常是一个视图函数
- 参数: 可选的要传送给视图函数的默认值(字典形式)
- 一个可选的name参数
需要注意的是:
Django 2.0版本中的路由系统是下面的写法
from django.urls import path,re_path urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive), path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail), ]
2.0版本中的re_path和1.11版本的url是一样的用法
一 分组 匹配:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
如果 使用了分组 匹配,那就相当于是一个分组 一个 参数,会按照位置参数传递给 视图函数.(需要说明的是,传给视图函数的参数过来是一个字符串)
二 命名分组:(起名字)
他会把参数一以关键字餐宿传给视图函数
三 视图函数中可以指定默认值:
# urls.py中 from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # views.py中,可以为num指定默认值 def page(request, num="1"): pass
四 解决url太多得问题 (app区分功能的) 路由分发:
from django.conf.urls import url, include from django.contrib import admin # 自带的 from app01 import views urlpatterns = [ url(r'^app01/', include('app01.urls')), # 先匹配一级目录 然后再匹配二级或三级 url(r'^app02/', include('app02.urls')), ]
五 url 和反向解析 (成对出现的)视图和模板都可以
导入模块: from django.urls import NoReverseMatch, reverse
1.普通url :
命名:
url(r'^blog/$', views.blogs, name='xxxxx'), # 这里反向解析拿到的是 /blong/ 可以理解为跟他的别名(name没关系,)
只是通过这个name(可以随便写)想拿到哪的前面的完整的地址,其目的是你前面的正则怎么变,我都可以把它转成一个地址拿出来,通常
这里对应的一个html的文件名,我们就可以不用写死就能跳转地址.
视图中:
reverse('xxxxx') ——》 ‘/blog/’
模板中:让4edqw
{% url 'xxxxx' %} 这是固定格式
2.分组:
命名:
url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog, name='blog'),
视图中:
reverse('blog',args=('2019','01')) ——》 ‘/blog/2019/01/’ # 这里反向解析只不过是想生成一个我自己想要的
全地址 跟你网页输入的地址没有关系,这里就相当于,我给的两个参数2019和01 再加上之前正则里的blong 跟name没关系,不过
要说的是,我要想拼和他的格式一样的地址,可以加一个args()里面可以,跟多个参数
3命名分组:
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog, name='blog'),
视图中:
reverse('blog',args=('2019','01')) ——》 ‘/blog/2019/01/’ reverse('blog',kwargs={'year':'2018','month':12}) ——》 ‘/blog/2018/12/’
模板中:
{% url 'blog' '2018' '12' %} ——》 /blog/2018/12/ {% url 'blog' year='2018' month='12' %} ——》 /blog/2018/12/ {% url 'blog' month='12' year='2018' %} ——》 /blog/2018/12/
六 namespace
url('app01/', include('app01.urls', namespace='app01')),
url('app02/', include('app02.urls', namespace='app02'))
视图:
reverse('app01:home')
模板;
{% url 'app01:home' %}