Django之反向生成url
首先新建一个项目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/test和http://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的更多相关文章
- django 后端反向生成url
导入模块 from django.core.urlresolvers import reverse reverse() reverse(viewname, urlconf=None, args=Non ...
- Django REST framework反向生成url
Django REST framework是一个基于Django的框架,REST framework又是怎么反向生成url的呢?? 在前面的例子中,知道在REST framework中有6种版本控制的 ...
- reverse(两种反向生成url django原生形式和rest_framework中版本的形式)
reverse(两种反向生成url django原生形式和rest_framework中版本的形式) views.py from django.shortcuts import render,Http ...
- django模板传入参数的处理方式与反向生成url
前端模板传入参数的处理方式 1.传入单个参数: 前端使用href="/sel-{{ row.0 }}.html, url使用url(r'sel-(.+).html',home.index), ...
- Django中反向生成models
我们在展示django ORM反向生成之前,我们先说一下怎么样正向生成代码. 正向生成,指的是先创建model.py文件,然后通过django内置的编译器,在数据库如mysql中创建出符合model. ...
- django路由系统之反向生成url
from niubin.service import v1 from django.urls import reverse from django.shortcuts import HttpRespo ...
- 关于反向生成url
1.模板渲染 <form action="{% url "bieming" 参数 %}" > <input type="text&q ...
- 数据库表反向生成(二) Django ORM inspectdb
在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么 ...
- python Django 之 Model ORM inspectdb(数据库表反向生成)
在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么 ...
随机推荐
- Python爬虫笔记(一):爬虫基本入门
最近在做一个项目,这个项目需要使用网络爬虫从特定网站上爬取数据,于是乎,我打算写一个爬虫系列的文章,与大家分享如何编写一个爬虫.这是这个项目的第一篇文章,这次就简单介绍一下Python爬虫,后面根据项 ...
- dfs学习总结
今天做到了dfs的训练,感觉和bfs有相似之处,接下来用一道题来总结一下方法,可类比bfs. 上题: Description There is a rectangular room, covered ...
- 让BLE设备的名称包含MAC地址
对于研发和测试BLE来说,经常看到同名的设备,是极为不方便的,一大堆设备同时上电会让同事不知道哪一个设备才是自己真正想操作的目标.再说一下小米手环,家中有三支小米手环,打开设备搜索全是“MI”,都不知 ...
- cesium编程入门(六)添加 3D Tiles,并调整位置,贴地
添加 3D Tiles,并调整位置 3D Tiles 是什么 3DTiles数据集是cesium小组AnalyticlGraphics与2016年3月定义的一种数据集,3DTiles数据集以分块.分级 ...
- c++---天梯赛---大笨钟
★题目: ★思路分析: 对可能的情况进行分类处理.在这里我把它们分成了3大类. ①不在敲钟时间 ②在敲钟时间但为整点 ③在敲钟时间且不为整点. 在敲钟时间段内我们可分别对晚8点前后进行分类讨论, 我们 ...
- Arrays类详解
数组是数据结构中最简单的一种类型.在平常的使用上也比较多见.今天就来总结一下数组在使用过程中的一些心得 1.java中包装数组的一些基本用法的抽象类 java.util.Arrays.这个类中包含操 ...
- PHP项目开发
PHP项目开发 =================================== member:(用户表) userid username password name mobile emai a ...
- [拾 得] 一枚迷人的贝壳 SHELL / Linux | shell 脚本初步入门
坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/ 索引: 什么是shell shell的分类 shell脚本的执行方式 ...
- 《HelloGitHub》第 22 期
公告 年前最后一期,下次就是年后了,老时间 每月的 28 号,年后见- <HelloGitHub>第 22 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 G ...
- Jade报错:Invalid indentation,you can use tabs or spaces but not both问题
现象:通过html生成jade文件之后,更改jade文件时,语句没什么问题的情况下,jade文件编译不通过,报错:Invalid indentation,you can use tabs or spa ...