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
引入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' %}
View Code

/

/

通过命名,反向拿到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了。

 

图书管理系统删除功能三合一

 

posted @ 2018-09-13 15:32  Flr  阅读(781)  评论(0)    收藏  举报