Django之反向生成url
2017-11-01 08:31
471 查看
首先新建一个项目test_url,项目包含一个名为app01的应用
在
启动项目,用浏览器打开
页面如下
上面的例子是正向生成url,既然Django可以正向生成url,当然也可以反向生成url
用浏览器打开
而服务端打印的反向生成的utl如下
可以看到,浏览器的地址栏里显示的url跟我们输入的地址不一样,而是跟Django的路由表中设置了路由别名的url是一样的.
从上面的例子可以看出,反向生成url已经成功了.
修改
浏览器打开
浏览器的地址变成了
而在服务端后台打印反向生成的url为
使用正则表达式通过kwargs传入参数反向生成url
修改
浏览器打开
后台打印反向生成的url
再来看反向生成url时,
修改
浏览器打开
再来反向生成url
浏览器打开
Django的报错信息提示:test1不是一个有效的视图函数或模式的名称
修改
浏览器再次打开
如果url中出现了
把
浏览器再次打开
在后台打印加入
通过博客Django中url的生成过程详解
知道一个项目的url是可以嵌套多层的,那么多层嵌套url的
修改
这个url嵌套了3层,最里面一层的url设定了别名,最里面一层的url向外找,应该用谁的
最里面一层的url向外找,中间一层的url的
修改
浏览器打开
如果中间一层也有
只添加url2这个namespace,刷新浏览器页面
在上面的例子基础上添加url1这个
再次刷新浏览器
所以,如果url使用了多层嵌套,且每一层嵌套都有各自的
必须要把所有的
当一个项目中有多个应用,每个应用的url都嵌套了多层且里层的url和name别名相同的时候,这时就可以根据namespace来区分不同应用的相同url.
在
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 REST framework反向生成url
- Django url反向解析与路由分发名称空间
- Python3之Django Web框架URL匹配、反向解析及部分错误处理
- 利用Django中的url方法实现地址动态拼接自动生成超链接地址
- Django url反向解析 reverse()
- django 有model生成SQL以及现有反向表生成model
- Django中反向生成models.py
- Django的url反向解析
- Django 反向生成 从数据库生成Model
- Django中反向生成models.py的实例讲解
- Django生成表和反向生成Model
- Django访问静态资源及连接mysql数据库(反向生成表)
- Django url的反向解析
- django反向解析URL和URL命名空间的方法
- Django url的命名空间 url反向解析
- Django生成表和反向生成Model
- Django中url的反向查询的方法
- Django中url的生成过程详解
- 数据库表反向生成(二) Django ORM inspectdb