设么是路由?

  它的本质是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区分功能的) 路由分发:

  include 

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' %}

 

  

   

 

posted on 2019-01-24 22:24  隐&  阅读(174)  评论(0编辑  收藏  举报