zoukankan      html  css  js  c++  java
  • django url 软编码

    期初用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 编辑]
  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/cmsd/p/5041270.html
Copyright © 2011-2022 走看看