8,Django-路由系统之include-URL命名和反向解析-namespace-三合一功能-字段类型和参数
路由系统之include-URL命名和反向解析-namespace-三合一功能-字段类型和参数
注意:
视频:04-路由系统之include-URL命名和反向解析 18:00,33:00处,
include
(1)在app01下面新建一个py文件,命名为:urls.py
(2)在步骤1的py文件里面写,引入模块,
from django.conf.urls import url from app01 import views urlpatterns=[ url(r'^home/[0-9]{4}/[0-9]{2}/',views.home) ]
(3)在urls文件里面(跟settings同级的urls文件)
from django.conf.urls import url,include urlpatterns = [ url(r'app01/',include('app01.urls')), #里面的('app01.urls')就是步骤一创建的py文件名, #url(r'app02/',include('app02.urls')), ]
/
/
/
views部分代码
def home(request): return HttpResponse('这是app02的book')
浏览器地址栏输入如下地址
http://127.0.0.1:8000/app01/home/1999/10
(4)url的分发
app01:相当于一级目录
/book/2018/09/ :相当于二级目录
命名URL和URL的反向解析
第一步:settings同级的urs文件里面
url(r'^author/',views.author_list,name='author_list'),
第二步
app01的views文件里写,重点是后引进来的reverse
引入reverse的两种方法

先引入模块,reverse是后引进来的, 第一种方式 from django.shortcuts import render,HttpResponse,redirect,reverse 第二种方式, from django.urls import reverse
from django.shortcuts import render,HttpResponse,redirect,reverse
再在具体的函数下面写,(reverse括号里面的author_list就是第一步里的name值,)
#这是未进行替换之前的代码:return redirect('/author_list/')
return redirect(reverse('author_list'))
在html文件里面要改的话,写上
<form action="{% url 'author_list' %}" method="post">
简单整理

url的命名和反向解析 urls.py: url(r'^author_list/$', views.author_list, name='author_list'), url(r'^home/([0-9]{4})/([0-9]{2})/',views.home,name='home'), url(r'^home/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/',views.home,name='home'), 视图中反向解析: from django.urls import reverse reverse('author_list') ——》 '/author_list/' 无名分组: reverse('home',args=('1999','06')) ——》'/home/1999/06/' 有名分组 reverse('home',kwargs={'year':'1998','month':'06'}) ——》'/home/1998/06/' 模板中反向解析: {% url 'author_list' %} ——》 '/author_list/' 无名分组: {% url 'home' '2000' '09' %} 有名分组: {% url 'home' '2000' '09' %} {% url 'home' month='09' year='1898' %}
/
/
通过命名,反向拿到URL的字符串, name='xxx'写死了,但url可以随意改了,
/
命名空间
即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。
举个例子:
project中的urls.py
from django.conf.urls import url, include urlpatterns = [ url(r'^app01/', include('app01.urls', namespace='app01')), url(r'^app02/', include('app02.urls', namespace='app02')), ]
app01中的urls.py
from django.conf.urls import url from app01 import views app_name = 'app01' urlpatterns = [ url(r'^(?P<pk>\d+)/$', views.detail, name='detail') ]
app02中的urls.py
from django.conf.urls import url from app02 import views app_name = 'app02' urlpatterns = [ url(r'^(?P<pk>\d+)/$', views.detail, name='detail') ]
现在,我的两个app中 url名称重复了,我反转URL的时候就可以通过命名空间的名称得到我当前的URL。
语法:
'命名空间名称:URL名称'
模板中使用:
{% url 'app01:detail' pk=12 pp=99 %}
views中的函数中使用
v = reverse('app01:detail', kwargs={'pk':11})
这样即使app中URL的命名相同,我也可以反转得到正确的URL了。
图书管理系统删除功能三合一