期初用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$','news_index' ),
)

Templates里的html为
<a href="/article">资讯</a> 
而且不止一个页面,可能有很多个页面使用到资讯的链接,这时你的Templates上就会有许多那样的页面a标签,当有一天,你突然想改变地址的叫法,

 程序代码
urlpatterns = patterns('',    
    (r'^news$','news_index' ),
)

你会发现,你在Templates中得修改10个<a href="/article">资讯</a>成<a href="/news">资讯</a>
可恨的是那样的标签分布在不同的页面上,有更糟糕的时候就是 你不知道到底有多少个那样的a标签(总不能一个个数嘛)。

有了url情况就大为不一样了,
urlpatterns里定义了资讯的首页地址,

 程序代码
urlpatterns = patterns('',    
    url(r'^article$','news_index' ,name="news_index"),
)

Templates里的html为

 程序代码
<a href="{%url 'news_index'%}">资讯</a>

你怎么修改urlpatterns的地址,Template都会随着改变,省事了不少。

url的用法也很简单,只要在urlpatterns里使用它,附加一个name,如:

 程序代码
url(r'^article$','news_index' ,name="news_index"),

Templates里 这样使用

 程序代码
{%url 'name'%}

地址链接就能使用了。注意的是name是全局的,你整个urlpatterns里只能一个唯一的name,这个道理应该好理解,就像网站的地址也是唯一性的。
Templates里的用法简单,在views里怎么用呢?以前在没有使用的url函数的时候,可能指向一个地址使用 
HttpResponseRedirect("/article")
当然urlpatterns改变地址叫法的时候,所用的views的指向函数的参数都得跟着变。有了url函数,变成:
HttpResponseRedirect(reverse("news_index"))
好处和Template里使用的情形一样的。

当遇到urlpatterns的地址包含有参数的时候,如:

 程序代码
(r'^(?P<year>\d{4})/(?P<month>\d{1,2})/$','news_list' ),

有两个参数,最终的地址如归档的地址http://www.yihaomen.com/2010/02
情况变复杂点了,urlpatterns的以上的用法不变:

 程序代码
url(r'^(?P<year>\d{4})/(?P<month>\d{1,2})/$','news_list',name="news_archive" ),

Templates里的用法就需要改改了,我们把url看成一个方法,结合templates的语法,结果就出来了:

 程序代码
<a href="{%url 'news_archive' 2010  02%}">2010年02月</a> 
或者这样:
<a href="{%url '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("news_archive",kwargs={"year":2010,"month":02})

比如: return HttpResponseRedirect(reverse("news_archive",kwargs={"year":2010,"month":02}))
即可,最后解析出来的地址为“/2010/02”。

由此看出,在用 django开发应用的时候,url 标签是个很灵活的东西,应该多用,也为以后维护带来方便。

 
除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
 
[本日志由 轻舞肥羊 于 2013-01-23 12:23 AM 编辑]

django url 软编码的更多相关文章

  1. Django Url编码问题

    Django Url编码问题   最近在学习Django,写一个blog程序练练手手.对于一个才开始接触web开发的来说,难免会遇到一些问题.   有一个这样的模板: {%for k,v in cat ...

  2. python :Django url /views /Template 文件介绍

    1,Django URL 路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Django ...

  3. 第五篇Django URL name 详解

    Django URL name 详解 利用Django开发网站,可以设计出非常优美的url规则,如果url的匹配规则(包含正则表达式)组织得比较好,view的结构就会比较清晰,比较容易维护. Djan ...

  4. 【Web】URI和URL,及URL的编码

    URI和URL是什么,以及他们的区别 URL,Uniform Resource Locator,统一资源定位符.用于表示网络上服务器的资源所在位置,比如我们输入浏览器的地址. URI,Uniform ...

  5. JS 和 Java 中URL特殊字符编码方式

    前几天遇到url特殊字符编码的问题,在这里整理一下: JavaScript 1.  编码 escape(String) 其中某些字符被替换成了十六进制的转义序列. 解码 unescape(String ...

  6. html-----018----HTML Web Server/HTML URL 字符编码

    HTML Web Server 如果希望向世界发布您的网站,那么您必须把它存放在 web 服务器上. 托管自己的网站 在自己的服务器上托管网站始终是一个选项.有几点需要考虑: 硬件支出 如果要运行“真 ...

  7. url在线编码和解码

    在工作中,经常遇到encode之后的url.想查看里面的某个参数的时候,很不直观.今天在网上搜了一下对url在线编码和解码的网站.对我来说,使用起来很方便.而且这个网站里面,不仅仅有对url的编码和解 ...

  8. URL的编码和解码

    URL的编码和解码 参考:阮一峰--关于URL编码 1 为什么要URL编码 在因特网上传送URL,只能采用ASCII字符集 也就是说URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和 ...

  9. JS对url进行编码和解码(三种方式区别)

    Javascript语言用于编码的函数,一共有三个,最古老的一个就是escape().虽然这个函数现在已经不提倡使用了,但是由于历史原因,很多地方还在使用它,所以有必要先从它讲起. escape 和 ...

随机推荐

  1. Mininet实验 基于Mininet实现BGP路径挟持攻击实验

    参考:基于Mininet实现BGP路径挟持攻击实验 实验目的: 掌握如何mininet内模拟AS. 掌握BGP路径挟持的原理和分析过程. 实验原理: 互联网是由相互连接的自治系统AS组成的,通过一个通 ...

  2. Ubuntu中搭建Nginx+PHP环境最简单的方法

    先安装: sudo apt-get install nginx php5-fpm 然后编辑配置文件: sudo gedit /etc/nginx/site-available/default 找到lo ...

  3. diy-pagination-javascript 分页

    <?php isset($_REQUEST['form_single_page_num']) && !empty($_REQUEST['form_single_page_num' ...

  4. shell常用代码

    grep -lr 'hello' /usr/share/* #在/usr/share目录下查找包含hello的字符串 NOW_DATE=`date "+%Y%m%d%H%M%S"` ...

  5. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  6. 蓝牙BLE ATT剖析(二)-- PDU

    一.Error Handling Error Response The Error Responseis used to state that a given request cannot be pe ...

  7. SQL Server批量数据导出导入BCP使用

    BCP简介 bcp是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据.bcp可以将数据库的表或视图直接导出,也能通过 ...

  8. 20145211 《Java程序设计》实验报告二:Java面向对象程序设计

    实验要求 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验内容 单元测试 面向对象三要素 设计模式初步 练习 实 ...

  9. backbone extend 源码分析

    var extend = function(protoProps, staticProps) { var parent = this; var child; if (protoProps && ...

  10. Linux-modules software

    简介 这里指的modules不是linux内核相关的module,只是用于软件多版本控制的一个开源软件包,比如说系统同时有neo4j的不同版本,使用modules软件就可以使得在需要的时候选择相应的软 ...