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

了。

时间: 2024-10-13 22:26:46

django permalink的相关文章

django上传图片,ImageField

今天看django的时候,突然发现model里有个ImageField,原以为django的model只是一个ORM的框架,没想到连上传图片到服务器都可以搞定,于是结合例子尝试了一下.ImageField需要PIL的支持,所以没装PIL这个库的需要先安装. 首先建立两个model: class Item(models.Model): name = models.CharField(max_length=250) description = models.TextField() class Met

django 名词解释

1) 什么是slug http://stackoverflow.com/questions/427102/what-is-a-slug-in-django 如上链接红色部分就是slug,它就是链接的最后一部分,slug有一些特殊的格式要求,所以model中还专门定义了一个SlugField用来添加到url里面 2)  什么是permalink http://wwj718.github.io/django-permalink.html permalink 是一个根据view function名称和

Django学习笔记—Comments库的使用方法小记

comments库是django框架内置的一个评论库,官方文档地址:https://docs.djangoproject.com/en/dev/ref/contrib/comments/可以快捷的搭建出网站需要的评论系统.不过对这个库的评价似乎褒贬不一,我自己在使用中的感受是要想让这个库能够比较完美的工作,可能自己需要做较多的定制工作,有时想想,还真不如自己重头写来的爽气.这里照例把自己的一些使用经验记录一下,以供参考. 一.激活步骤 添加APP:INSTALLED_APPS=(‘django.

实战Django:Pastebin

  这是<Django Web开发指南>中的最后一个实例.如果说上一个实例Liveblog重点讲的是Django和Ajax的协作,那么我们在Pastebin中,将学习到Django和高亮语法JS的协作,顺便复习一下在Django中加入表单. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject pastebinpr

Django装饰器[email&#160;protected]

- 用法:拼接url @permalink def get_absolur_url(self): return "cms-story", {}, {'slug': self.slug} 函数返回三个参数:第一个参数是url映射name,第二个一般为空,第三个参数是一个dict - 源码 def permalink(func): from django.urls import reverse @wraps(func) def inner(*args, **kwargs): bits =

实战Django:小型CMS Part1

CMS,即Content Management System,内容管理系统.我们这里要开发的小型CMS应用,从结构上和blog应用有些类似,但我们会在这里加入一些新的技术,比如说工作流.搜索功能.编辑组件等. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject cmsproject 然后在dos命令提示符下继续输入如下命令,

Django创建博客应用

最近在看一篇全栈增长工程师实战,然后学习里面的项目,结果发现作者用的技术太过老旧,好多东西都已经被抛弃了,所以结合着官方文档和自己的一些理解将错误的信息替换一下,边写边学习 准备工作和工具 作者说需要一些python基础,但是中国程序员是最好的程序员,没有基础照样看,大不了遇到不懂的现学就是喽 需要在计算机上安装一些工具 Python环境及包管理工具pip 一款浏览器,推荐Chrome,当然,用自己喜欢的浏览器也可以 版本控制,推荐用Git,但是很多培训机构出来的只会SVN,所以这个没有什么重要

Django 自带comment评论库使用

comments库是django框架内置的一个评论库,可以快捷的搭建出网站需要的评论系统. Django1.9版本使用django_comments而非“django.contrib.comments”,直接pip install django-contrib-comments即可. 一.激活步骤 在setting.py的INSTALLED_APPS中加入如下appINSTALLED_APPS = ( ... 'django_comments', ...) 二.如何在模板中使用comments

实战Django:网络相册Part1

这个实例与上个实例一样,源自<Django Web开发指南>,舍得根据Django 1.7.1的特性进行了重新编写. <Django Web开发指南>中所用的Django是1.0版,和现在的最新版本相比,有很大差异,比如通用视图.URL.静态文件的处理等等.最初做这本书的实例时,这些变化曾给舍得带来很大的困扰,还好,实例做得多了,慢慢掌握了一些规律,最终把这些实例修改成在Django 1.7.1下可以运行的版本.   1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符