首页 > 代码库 > django permalink

django permalink

permalink,能更好的防止硬编码,而且也是比较隐含的函数,它比url函数更高级点。它在 python的世界里是一个装饰器,短短几行代码,更为精炼:


def permalink(func):

    from django.core.urlresolvers import reverse

    def inner(*args, **kwargs):

        bits = func(*args, **kwargs)

        return reverse(bits[0], None, *bits[1:3])

    return inner

它到底怎么用呢?举例子更好说明些,一个blog,通俗些是一篇文章。我想地址像这样:

panjj/Django/2010/03/09/28

地址是: 博主/类别/发表年份/发表月份/发表日期/博客ID/ ,看看地址就会发现地址的六个参数都是一篇博客里的字段。这时到

permalink发挥的时候了。

我们在urlpatterns定义博客的地址

urlpatterns = patterns(‘myproject.blog.views‘,

    url(r‘^(?P<username>\w+)/(?P<category>\w+)/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<id>\d+)$‘,‘blog‘,

        name="blog" ),)

博客的实体类里 定义一个子方法:

    @models.permalink

    def get_absolute_url(self):

        return ("blog", None, {

                    "username":self.user.username,

                    "category":self.category.slug,

                    "year": self.created_at.year,

                    "month": "%02d" % self.created_at.month,

                    "day": "%02d" % self.created_at.day,

                    "id": self.id

            })

在模板Templates里 直接使用{%blog. get_absolute_url%} 解析出来的地址就是我们想要的了地址字符串:

panjj/Django/2010/03/09/28


urlpatterns 定义的博客地址 使用到了url函数,这样我们在实体类子方法get_absolute_url里就能直接找到那个url函数(因为url函数指定了参数name,全站是唯一的)。get_absolute_url方法第一个参数,是对应urlpatterns定义的博客地址匹配url函数;第二个我们暂时不需要,设个 None;第三个是一个字典,就是地址需要的六个参数:博主/类别/发表年份/发表月份/发表日期/博客ID/的值,他们在实体中都能取得到值的;注,参数名字和值 与urlpatterns定义博客地址的正则表达式要顺序一一对应,结果才能解析出地址来。


在模板Templates里使用某个博客的链接 这下子就简单多了,只要查到博客的一个实体,就能轻易得出相应博客的地址,而且去掉了url硬编码的毛病,urlpatterns定义的博客地址叫法如何改变也不会影响模板的写法。


开始的时候 说它比url更高级,是因为在以上的场合,使用permalink 在模板上解析地址比url函数要精简的多,如今天的博客例子在模板上你可能这么写:

{%url blog blog.user.username,blog.category,blog.created_at.year,blog.created_at.month,blog.created_at.day,blog.id%}

而有了permalink ,你就可以写成:

{%blog. get_absolute_url%}

了。


django permalink