首先新建一个项目test_url,项目包含一个名为app01的应用

urls.py文件中生成如下内容

    from django.conf.urls import url
from django.shortcuts import HttpResponse def index(request): return HttpResponse("index") def test(request): return HttpResponse("test") urlpatterns = [
url(r'^index',index),
url(r'^test',test),
]

启动项目,用浏览器打开http://127.0.0.1:8000/testhttp://127.0.0.1:8000/index/

页面如下

上面的例子是正向生成url,既然Django可以正向生成url,当然也可以反向生成url

无参数反向生成url

修改urls.py文件

    from django.conf.urls import url
from django.shortcuts import HttpResponse,redirect def index(request): from django.urls import reverse # 导入reverse reverse_url=reverse("test_url") # 用reverse把别名为test_url的路由反向生成url
print("reverse_url:",reverse_url) # 打印反向生成的url return redirect(reverse_url) # 重定向到反向生成的url def test(request): return HttpResponse("test") urlpatterns = [
url(r'^index',index),
url(r'^test1/test2/test3/test',test,name="test_url"), # 为test路由设置一个test_url别名
]

用浏览器打开http://127.0.0.1:8000/index,然后回车

而服务端打印的反向生成的utl如下

可以看到,浏览器的地址栏里显示的url跟我们输入的地址不一样,而是跟Django的路由表中设置了路由别名的url是一样的.

从上面的例子可以看出,反向生成url已经成功了.

有参数的反向生成url

使用正则表达式通过args传入参数反向生成url

修改urls.py文件

    from django.conf.urls import url
from django.shortcuts import HttpResponse,redirect def index(request): from django.urls import reverse reverse_url=reverse("test_url",args=(2,8))
print("reverse_url:",reverse_url) return redirect(reverse_url) def test(request,*args,**kwargs): return HttpResponse("test") urlpatterns = [
url(r'^index',index),
url(r'^test1/(\d+)/test2/test3/(\d+)/test',test,name="test_url"),
]

浏览器打开http://127.0.0.1:8000/index这个地址

浏览器的地址变成了

而在服务端后台打印反向生成的url为

使用正则表达式通过kwargs传入参数反向生成url

修改urls.py文件

    from django.conf.urls import url
from django.shortcuts import HttpResponse,redirect def index(request): from django.urls import reverse reverse_url=reverse("test_url",kwargs={"a1":23,"a2":37})
print("reverse_url:",reverse_url) return redirect(reverse_url) def test(request,*args,**kwargs): return HttpResponse("test") urlpatterns = [
url(r'^index',index),
url(r'^test1/(?P<a1>\d+)/test2/test3/(?P<a2>\d+)/test',test,name="test_url"),
]

浏览器打开http://127.0.0.1:8000/index这个地址

后台打印反向生成的url

反向生成url之namespace

在上面的例子里,反向生成url使用的是一个视图函数和一个url别名

再来看反向生成url时,namespace的用法

修改urls.py文件

    from django.conf.urls import url
from django.shortcuts import HttpResponse,redirect def index(request): return HttpResponse("index") def test(request,*args,**kwargs): return HttpResponse("test") urlpatterns = [
url(r'^app01/',([
url(r'^index/', index, name="index1"),
url(r'^test/', test, name="test1"),
],"url1","url1")),
]

浏览器打开http://127.0.0.1:8000/app01/index这个地址

再来反向生成url

	from django.conf.urls import url
from django.shortcuts import HttpResponse, redirect def index(request):
from django.urls import reverse reverse_url=reverse("test1")
print("reverse_url:",reverse_url) return HttpResponse("index") def test(request, *args, **kwargs):
return HttpResponse("test") urlpatterns = [
url(r'^app01/', ([
url(r'^index/', index, name="index1"),
url(r'^test/', test, name="test1"),
], "url1", "url1")),
]

浏览器打开http://127.0.0.1:8000/app01/index这个地址

Django的报错信息提示:test1不是一个有效的视图函数或模式的名称

修改urls.py文件

    from django.conf.urls import url
from django.shortcuts import HttpResponse, redirect def index(request):
from django.urls import reverse reverse_url=reverse("test1")
print("reverse_url:",reverse_url) return HttpResponse("index") def test(request, *args, **kwargs):
return HttpResponse("test") urlpatterns = [
url(r'^app01/', ([
url(r'^index/', index, name="index1"),
url(r'^test/', test, name="test1"),
], None, None)),
]

浏览器再次打开http://127.0.0.1:8000/app01/index这个地址

如果url中出现了namespace,必须在reverse方法中加入namespace

urls.py修改,在reverse中加入namespace

    from django.conf.urls import url
from django.shortcuts import HttpResponse, redirect def index(request):
from django.urls import reverse reverse_url=reverse("url1:test1")
print("reverse_url:",reverse_url) return HttpResponse("index") def test(request, *args, **kwargs):
return HttpResponse("test") urlpatterns = [
url(r'^app01/', ([
url(r'^index/', index, name="index1"),
url(r'^test/', test, name="test1"),
], "url1", "url1")),
]

浏览器再次打开http://127.0.0.1:8000/app01/index这个地址

在后台打印加入namespace的反向生成的url

通过博客Django中url的生成过程详解

知道一个项目的url是可以嵌套多层的,那么多层嵌套url的namespace应该怎么设定呢??

修改urls.py文件的urlpatterns如下

	urlpatterns=[
url(r'^app01/',([
url(r'^userinfo/',([
url(r'^index/',index,name="index1"),
url(r'^test/',test,name="test1"),
],None,None))
],"url1","url1"))
]

这个url嵌套了3层,最里面一层的url设定了别名,最里面一层的url向外找,应该用谁的namespace呢??

最里面一层的url向外找,中间一层的url的namespace为None,即没有设定namespace,应该继续向最外面一层寻找namespace

修改urls.py文件,在reverse方法中添加namespace

    from django.conf.urls import url
from django.shortcuts import HttpResponse, redirect def index(request):
from django.urls import reverse reverse_url=reverse("url1:test1")
print("reverse_url:",reverse_url) return HttpResponse("index") def test(request, *args, **kwargs):
return HttpResponse("test") urlpatterns=[
url(r'^app01/',([
url(r'^userinfo/',([
url(r'^index/',index,name="index1"),
url(r'^test/',test,name="test1"),
],"url2","url2"))
],"url1","url1"))
]

浏览器打开http://127.0.0.1:8000/app01/userinfo/index/地址

如果中间一层也有namespace,这时就有两个namespace,此时应该用哪个namespace呢??

    from django.conf.urls import url
from django.shortcuts import HttpResponse, redirect def index(request):
from django.urls import reverse reverse_url=reverse("url2:test1")
print("reverse_url:",reverse_url) return HttpResponse("index") def test(request, *args, **kwargs):
return HttpResponse("test") urlpatterns=[
url(r'^app01/',([
url(r'^userinfo/',([
url(r'^index/',index,name="index1"),
url(r'^test/',test,name="test1"),
],"url2","url2"))
],"url1","url1"))
]

只添加url2这个namespace,刷新浏览器页面

在上面的例子基础上添加url1这个namespace

    from django.conf.urls import url
from django.shortcuts import HttpResponse, redirect def index(request):
from django.urls import reverse reverse_url=reverse("url1:url2:test1")
print("reverse_url:",reverse_url) return HttpResponse("index") def test(request, *args, **kwargs):
return HttpResponse("test") urlpatterns=[
url(r'^app01/',([
url(r'^userinfo/',([
url(r'^index/',index,name="index1"),
url(r'^test/',test,name="test1"),
],"url2","url2"))
],"url1","url1"))
]

再次刷新浏览器

所以,如果url使用了多层嵌套,且每一层嵌套都有各自的namespace,在使用reverse进行反向生成url的时候

必须要把所有的namespace从最外层向里层使用":"连接起来.

namespace(名称空间)的作用是什么呢??

  • 当一个项目中有多个应用,每个应用的url都嵌套了多层且里层的url和name别名相同的时候,这时就可以根据namespace来区分不同应用的相同url.

Django之反向生成url的更多相关文章

  1. django 后端反向生成url

    导入模块 from django.core.urlresolvers import reverse reverse() reverse(viewname, urlconf=None, args=Non ...

  2. Django REST framework反向生成url

    Django REST framework是一个基于Django的框架,REST framework又是怎么反向生成url的呢?? 在前面的例子中,知道在REST framework中有6种版本控制的 ...

  3. reverse(两种反向生成url django原生形式和rest_framework中版本的形式)

    reverse(两种反向生成url django原生形式和rest_framework中版本的形式) views.py from django.shortcuts import render,Http ...

  4. django模板传入参数的处理方式与反向生成url

    前端模板传入参数的处理方式 1.传入单个参数: 前端使用href="/sel-{{ row.0 }}.html, url使用url(r'sel-(.+).html',home.index), ...

  5. Django中反向生成models

    我们在展示django ORM反向生成之前,我们先说一下怎么样正向生成代码. 正向生成,指的是先创建model.py文件,然后通过django内置的编译器,在数据库如mysql中创建出符合model. ...

  6. django路由系统之反向生成url

    from niubin.service import v1 from django.urls import reverse from django.shortcuts import HttpRespo ...

  7. 关于反向生成url

    1.模板渲染 <form action="{% url "bieming" 参数 %}" > <input type="text&q ...

  8. 数据库表反向生成(二) Django ORM inspectdb

    在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么 ...

  9. python Django 之 Model ORM inspectdb(数据库表反向生成)

    在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么 ...

随机推荐

  1. Asp.net Mvc 与 Web Api生命周期对比

    完整的生命周期比较复杂,对细节感兴趣的同学可购买老A的图书学习:传送门 本文只简单讲述路由注册.controller创建.action选择的3个主逻辑线,其他的内容大家可自己阅读相应的代码 先上二者单 ...

  2. windows sevser 2012搭建网站

    1,首先去服务器配置,从哪里下载iis8.0和asp.net和net.xx和web服务,iis控制,ftp等等服务根据自己的需求安装 安装好后把默认的网站删除掉.或者新建一个网站,把服务端口改为其他端 ...

  3. BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4989  Solved: 1847[Submit] ...

  4. Vijos P1784 数字统计【模拟】

    数字统计 背景 来自 NOIP2010 普及组 第一题 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如在给定范围[2, 22],数字2在数2中出现了1次,在数12中出现了1 ...

  5. 【Sql】mySQL在windows环境启动

    SQL的不同版本在Windows环境启动配置方法不同,此处仅介绍 5.7.20的配置方法: 1.登录mysql官网下载windows环境下的工具压缩包 http://dev.mysql.com/dow ...

  6. 启动时候报错由于没有扫包 error creating bean with name

    <!-- 扫描包,加载service实现类 --> <context:component-scan base-package="com.taotao.search.serv ...

  7. ZipKin的原理的介绍

    结构概述       跟踪器(Tracers)存在在你的应用程序中生存,记录时间和关于操作的元数据.他们经常使用库,因此他们的使用对用户是透明的.例如,当它收到一个请求并发送一个响应时,一个感应器(i ...

  8. POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3790 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你 ...

  9. iOS学习——键盘弹出遮挡输入框问题解决方案

    在iOS或Android等移动端开发过程中,经常遇到很多需要我们输入信息的情况,例如登录时要输入账号密码.查询时要输入查询信息.注册或申请时需要填写一些信息等都是通过我们键盘来进行输入的,在iOS开发 ...

  10. Nginx实战之反向代理WebSocket的配置实例

    http://www.jb51.net/article/112183.htm 最近在工作中遇到一个需求,需要使用 nginx 反向代理websocket,经过查找一番资料,目前已经测试通过,所以这篇文 ...