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%}
了。