Posts Tagged 'python'

Django用templatetags处理列表动态数据

Posted by Danfi on 2011-01-20 添加评论

以django例子里最常见的Books和Author为例,假设有Book和Author两张表。
models.py

  1. ...
  2. class Author(models.Model):
  3.        name = models.CharField(_('Author Name'),max_length=128)
  4.       
  5.        def __unicode__(self):
  6.              return self.name
  7.               
  8. class Books(models.Model):
  9.        title = models.CharField(_('Books'),max_length=128)
  10.        author = models.Foreignkey(Author, related_name='book_author')
  11.       
  12.        def __unicode__(self):
  13.              return self.title
  14. ...

如上述代码所示,假设每本书有一个作者,且名字唯一,然后我们对作者进行列表处理。

阅读全文…

Django学习之related_name

Posted by Danfi on 2010-12-15 添加评论

当一张表中外键指向同一个表的字段数大于等于2时,就得使用related_name,在最近的几次学习中发现,

related_name没有想象中那么简单,原本以为只是用于区分(不好好看文档的结果),结果在一次使用formsets

的过程中发现了问题,不管添加了多少子表单,form-TOTAL_FORMS恒不变, prefix后面跟的值永远是NAN,

细心的话就能发现firebug内显示的prefix与自己定义的明显不同,最后在主管的帮助下,问题渐渐明了,我在外键

内定义了related_name,该项就是firebug内显示的prefix,之后在使用反向查询时又出了问题,在Django Doc

里其实有句话说明了这个问题,

http://docs.djangoproject.com/en/dev/topics/db/queries/#many-to-many-relationships

Like ForeignKeyManyToManyField can specify related_name. In the above example, if the ManyToManyField

in Entry had specified related_name='entries', then each Author instance would have an entries attribute

instead of entry_set.

当定义了related_name后”_set”这类查询就被related_name代替了,所以用”_set”会报错。

再次介绍Project Babel这个GAE论坛程序

Posted by Danfi on 2010-11-09 12 条评论

距上一篇文章已两个月了现在程序也变了好多,就再次体验下。上传方法和第一篇介绍的一样,改应用名,添加验证的

key。再来看看程序的变化,首先是程序的整体颜色大变样,之前大致是黑白灰,现在背景变成了。。。叫不出这是什

么色,就叫蓝紫色吧。程序添加了国际化,可以切换中英文,在Settings(设置)中那个,而非Backstage(后台)。底

部的节点不再是修改main.py,而是Backstage(后台)>Site Settings(站点设置)的Home Categories(主页分类)

内添加,每行一个,然后在每个节点的下属节点的节点开放分类内(正是绕口)添加相应的Home Categories(主页分

类)。而登录后显示的快速发帖的那些链接只能手动修改文件\tpl\desktop\index.html,在其中找到相应位置修改成

自己的节点/go/xxx(下属节点的节点名),go是默认的,修改也可以,不过要改多个文件。时间不错,未再深入,待

续。

Django Template 过滤

Posted by Danfi on 2010-10-25 添加评论

{{ name | lower }} 小写

{{ my_text|escape|linebreaks }} 先转义文本到HTML,再转换每行到标签

{{ bio | truncatewords:”30″ }}显示前30个字

{{content|striptags}} 纯文本格式

{{ pub_date | date:”F j, Y” }}

{{ 123|add:”5″ }} 给value加上一个数值

{{ “AB’CD”|addslashes }} 单引号加上转义号,一般用于输出到javascript中

{{ “abcd”|capfirst }} 第一个字母大写

{{ “abcd”|center:”50″ }} 输出指定长度的字符串,并把值对中

{{ “123spam456spam789″|cut:”spam” }} 查找删除指定字符串

{{ value|date:”F j, Y” }} 格式化日期

{{ value|default:”(N/A)” }} 值不存在,使用指定值

阅读全文…

介绍个GAE论坛程序Project Babel

Posted by Danfi on 2010-09-05 14 条评论

起初在YOU8G上看到,发现这程序很简洁好看,所以搜索其代码,在http://github.com/livid/v2ex页发现其踪迹,

于是下载来尝试,起初以为只要修改应用名直接上传便可,谁知少了个验证码功能。遂在

http://www.google.com/recaptcha上注册此类验证,然后把得到的两个key分别填到config.py内,接下来上传。

上传完毕后可能会出现request错误,等待即可。待能访问后用gae的邮箱注册管理员,即可得到后台管理权限。

首先看下首页http://adjangoer.appspot.com/ 初步看了下几乎能用作博客程序了,只是缺少了文章内容显示,

不过这可以修改嘛。接下来看下后台并说下大致的功能:

发帖:必须在节点内才能发帖,简单的不能再简洁了,标题+内容。

记事本:可以算是只能自己看得到的帖子吧。

附近:这功能没怎么搞懂,显示着ip,类似于微博的页面,可能是同ip下可以互聊吧。

设置:填写资料,上传头像或者直接使用Gravatar的,修改密码,绑定twitter。

接着说下后台功能,

站点设置:设置站点名,标语,域名,简介,以及Analytics ID

区域:只有添加了区域才能添加节点(类似标签的存在),添加完节点还需在节点开放分类内添加分类才能在首页显示

而分类只有在main.py内修改(据说2.4版本可以在后台直接处理),添加,修改和上传直到节点生效我等了几分钟,

务必需要耐心。

其他功能未测试。

Django缩略图

Posted by Danfi on 2010-07-13 1条评论
  1. from PIL import Image
  2.  
  3. class Article(models.Model):
  4.   ...
  5.   photo = models.ImageField(upload_to='static/upload')      //图片路径
  6.     
  7.     def save(self):
  8.         if not self.id and not self.photo:
  9.             return
  10.         super(Article, self).save()
  11.         pw = self.photo.width                                    //取原图大小
  12.         ph = self.photo.height
  13.         filename = str(self.photo.url)
  14.         basename, format = filename.rsplit('.', 1)
  15.         miniature = basename + '_thumb'  + '.' +  format       //生成缩略图名
  16.         image = Image.open(filename)
  17.         if pw > 1000 or ph > 1000:             //根据大小设置缩小比率
  18.             p1 = float(pw) / 3
  19.             p2 = float(ph) / 3
  20.         elif (pw > 600 and pw<=1000) or ( ph > 600 and ph <= 1000):
  21.             p1 = float(pw) / 2
  22.             p2 = float(ph) / 2
  23.         else:
  24.             p1 = pw
  25.             p2 = ph
  26.         image = image.resize((p1, p2), Image.ANTIALIAS)
  27.         image.save(miniature)