django中url和reverse使用
使用url标签和reverse()函数,可以避免在模板和view中对url进行硬编码,这样即使url改变了,对模板和view也没有影响,
其实在模板, view中,如果想获取当前访问的url,那用request.path或request.get_full_path()是更方便的选择,当然,如果想在template中使用
request对象,那要在TEMPLATE_CONTEXT_PROCESSORS这个settings配置项中加入'django.core.context_processors.request'
原文:http://www.yihaomen.com/article/python/355.htm
起初用django 开发应用的时候,完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRedirect()也是硬编码转向地址,当然在template 中也是一样了,这样带来一个问题,如果在urls.py 中修改了某个页面的地址,那么所有的地方(views.py和template中)都要修改。如果是个很大的工程,那么要修改的地方就很多。当然,你也许会选择一个工具,直接查找替换来实现。除此之外呢.....
其实django 本身就提供了这个功能,就是 url 标签,利用 django 的 url 标签来实现这样的功能,在这个模块中:django/conf/urls/defaults
利用url 标签之后,不管urlpatterns里的某个地址叫法怎么改变,Templates里的地址都不用修改了。在模版中调用url标签的时候,需要:{% load url from future %}
比如没有采用url函数的时候:
urlpatterns里定义了资讯的首页地址,
程序代码urlpatterns = patterns('',
(r'^article$','get_news_index' ),
)
Templates里的html为
<a href="/article">资讯</a>
而且不止一个页面,可能有很多个页面使用到资讯的链接,这时你的Templates上就会有许多那样的页面a标签,当有一天,你突然想改变地址的叫法,
程序代码urlpatterns = patterns('',
(r'^news$','get_news_index' ),
)
你会发现,你在Templates中得修改10个<a href="/article">资讯</a>成<a href="/news">资讯</a>
可恨的是那样的标签分布在不同的页面上,有更糟糕的时候就是 你不知道到底有多少个那样的a标签(总不能一个个数嘛)。
有了url情况就大为不一样了,
urlpatterns里定义了资讯的首页地址, 如果要在模板中使用url标签,那么要在urlpatterns中为相应的url增加name参数,如下
程序代码urlpatterns = patterns('',
url(r'^article$','get_news_index' ,name="news_index"),
)
Templates里的html为
程序代码<a href="{%url 'appname:news_index'%}">资讯</a>
其中appname是该url所在的app的name,而new_index是url(r'^article$','get_news_index' ,name="news_index")中的name参数
你怎么修改urlpatterns的地址,Template都会随着改变,省事了不少。
地址链接就能使用了。注意的是name是全局的,你整个urlpatterns里只能一个唯一的name,这个道理应该好理解,就像网站的地址也是唯一性的。
Templates中使用url标签非常简单,那在views中用到url怎么办呢?以前在没有使用的url函数的时候,可能指向一个地址使用
HttpResponseRedirect("/article")
当然urlpatterns改变地址叫法的时候,所有的views的指向函数的参数都得跟着变。有了url函数,变成:
HttpResponseRedirect(reverse("news_index"))
好处和Template里使用的情形一样的。
当遇到urlpatterns的地址包含有参数的时候,如:
程序代码(r'^(?P<year>\d{4})/(?P<month>\d{1,2})/$','get_news_list' ),
有两个参数,最终的地址如归档的地址http://www.yihaomen.com/2010/02
情况变复杂点了,urlpatterns的以上的用法不变:
程序代码url(r'^(?P<year>\d{4})/(?P<month>\d{1,2})/$','get_news_list',name="news_archive" ),
Templates里的用法就需要改改了,我们把url看成一个方法,结合templates的语法,结果就出来了:
程序代码<a href="{%url 'appname:news_archive' 2010 02%}">2010年02月</a>
或者这样:
<a href="{%url 'appname:news_archive' year=2010 month=02%}">2010年02月</a>
当然,在你后台的views.py 中的方法上也必须有这两个参数,比如
程序代码def news_list(request,year,month):
print 'year:',year
print 'monty:',month
......
后面的2010, 02 就是参数了,参数之间用逗号隔开,多少个参数用法都一样的。当然,2010 02 参数是某个实体获得的,具体的情况具体分析。
在views呢,有了参数怎么写,万变不离宗:
程序代码from django.core.urlresolvers import reverse
......
reverse("appname:news_archive",kwargs={"year":2010,"month":02})
比如: return HttpResponseRedirect(reverse("appname:news_archive",kwargs={"year":2010,"month":02}))
即可,最后解析出来的地址为“/2010/02”。
由此看出,在用 django开发应用的时候,url 标签和reverse()函数是很屌的东西,应该多用,也为以后维护带来方便。
django中url和reverse使用的更多相关文章
- django中url路由配置及渲染方式
今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...
- Django中url匹配规则的补充
Django中url匹配规则是在urls.py文件中配置的. 1.关于正则匹配优先级 在url匹配列表中,如果第一条和第二条同时满足匹配规则,则优先匹配第一条. 在url匹配列表中,如果第一条为正则模 ...
- django中url 和 path 的区别
django中 url 和 path 都是配置路径,有什么不同? django.urls path django.conf.urls url path 与 url 是两个不同的模块,效果都是响应返回 ...
- django 中url与path小记
1. 在django 2.0中增加了一些新的特性 更简单的URL路由语法 (Simplified URL routing syntax) admin应用的针对移动设备的优化改进(Mobile-frie ...
- Django——URL详解/Django中URL是如何与urls文件匹配的
URL标准语法 protocol://hostname[:port]/path/[:parameters][?query]#fragment https://i.cnblogs.com/EditPos ...
- Django 中url补充以及模板继承
Django中的URL补充 默认值 在url写路由关系的时候可以传递默认参数,如下: url(r'^index/', views.index,{"name":"root& ...
- Django中url使用命名空间的错误
出的错误: 1. Reverse for 'llist' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) ...
- Django中URL有关
django 模板中url的处理 在模板中直接添加‘/home’这样的链接是十分不推荐的,因为这是一个相对的链接,在不同网页中打开可能会返回不一样的结果. 所以推荐的是 1 <a href= ...
- Django中url的反向查询
明确几个概念: application namespace: 正在部署的app的名称,一个app的多个实例应该具有相同的application namespace. 可以通过在URLconf模 ...
随机推荐
- 寻找猴王小游戏php代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 如何为指定python解释器安装pip
有时候我们通常会有很多python解释器,例如python2.python3.python(Anaconda). 参考链接:https://www.cnblogs.com/michaelcjl/p/1 ...
- python numpy数组操作2
数组的四则运算 在numpy模块中,实现四则运算的计算既可以使用运算符号,也可以使用函数,具体如下例所示: #加法运算 import numpy as npmath = np.array([98,83 ...
- aop思想以及环境搭建(记录自己的一小步)1.1
##什么是aop思想? 首先老办法我们一起先看看官网是咋描述的? 它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为 ...
- 最佳实践:Pulsar 为批流处理提供融合存储
非常荣幸有机会和大家分享一下 Apache Pulsar 怎样为批流处理提供融合的存储.希望今天的分享对做大数据处理的同学能有帮助和启发. 这次分享,主要分为四个部分: 介绍与其他消息系统相比, Ap ...
- js 原生功底 (一)
欢迎大家一起学习,点击查看
- 【基础知识】Unity查漏补缺
最近发现了一些平时不太注重的知识点,特此建立个专题,把零散的东西.疏忽的东西临时记录下来. Mecanim动画系统: 1)设置AnimatorController时,如果某个动作播放不正常. 首先打开 ...
- 用IDEA一年了,终于敢说自己会用了
作为Java老兵,我也是用了很多年的eclipse,为了与时俱进,于是切换到了IDEA.刚开始的时候感觉很不适应,感觉这玩意儿不如eclipse好用,影响工作效率,于是又换回eclipse. 但是很多 ...
- 关于JavaScript点击按钮打开多个页面被浏览器以广告嫌疑拦截怎么解决
JS点击按钮打开新的标签页,工作中遇到需要点击按钮打开一个或多个,需要用到window.open() 工作中我们可能需要打开多个,看以下代码: var data = [{ "id" ...
- Go测试开发(一) 怎么写Go代码
安装过程略过,网上搜一大把. 介绍 本文会在一个module中开发一个简单的Go package. 同时介绍go tool(也就是go命令行). 以及如何fetch,build和install Go的 ...