首页  »  django

Django1.0阿尔法发布

编程 jeff  |  2008-07-23 3 pythondjango

真是一个振奋人心的消息,Django终于要结束三年以上的版本长跑,出1.0版了.苦了社区里面的朋友,一直在苦苦等待.

这次发布的直接原因估计是前段时间Django易主,由新的基金会支持Django的发展.

本站是基于django开发D,当时的版本还是0.96,大概在去年9月份上的线,等到1.0正式版出来,马上就升级啦!

期待Django的正式版早日发布,期待更多的朋友加入django的行列.

更新日志

最近一直断断续续地给本系统做更新。由于时间关系,进展比较慢。这一次的更新主要是把后台管理界面重新设计,狠狠地补习了一顿DIV + CSS;还有就是使用上的Ext2.0。Ext和Json交互真的好处多多,在客户端对数据的操作确实非常方便。稍晚的时候将会整理一份Ext的使用心得。下面来些截图,尽管效果不太好 :)。原图太大撑破了布局,麻烦有兴趣的同学点击看大图吧,对不住了。

第一个图:后台主要的风格和Ext的表格。Blogger,WordPress都使用这样的导航菜单,我实在没其他好主意,就依葫芦画瓢了。用Django自定义标签来生成导航还是挺有意思的。

第二个图:分类管理的截图,使用Ext的可编辑表格做D。前后台数据交换方便快捷,爽歪了。

最后一个图了:写文章的截图,FCK的工具栏简化了,并且改用了Office的样式,看起来和总体的蓝色更协调一些。

秀完了。这一次的更新里面只使用了Ext的表格控件,接下来改造设置等功能的时候试一下它的Form控件和Django的Newform。

啊?这个界面让你想吐吗?真抱歉,我有空再继续深造我的CSS去吧。

Django分页方案

本文描述的是本站的分页方案。
由于分页功能在列表的地方通常会用到,所以最理想的分页方案实现应该是使用简单、可重用性高的。正如我希望在显示一个分页信息是通过下面的代码来实现:{% page_info datas '/blog/xxx/' %}。有一个名字叫Page的标签,接受两个参数,第一个参数是分页信息、数据(数据按需要来决定是否要),第二个参数是列表的URL。使用标签的目的是避免重复写相同的分页HTML代码。

着先,设计一个Pager类,该类存放分页相关信息:数据总数、当前页码、页码大小、上一页、下一页、首页、最后一页等,还有一个Datas属性供保存真实的数据,该属性应该是一个集合。下面来看看该类的代码:

python 代码
 
  1. class Pager:  
  2.     page_def = 1  
  3.     maxlength_def = 7  
  4.     def __init__(self,datas,total,page=page_def,maxlength=maxlength_def):  
  5.         if page < 1:  
  6.             self.page = 1  
  7.         if maxlength < 1:  
  8.             self.maxlength = 10  
  9.         self.datas = datas  
  10.         self.total = total  
  11.         self.page = page  
  12.         self.maxlength = maxlength  
  13.         self.first_page = 1  
  14.         self.last_page = (self.total / self.maxlength) + 1  
  15.         if self.page > 1:  
  16.             self.pre_page = self.page - 1  
  17.         else:  
  18.             self.pre_page = self.page  
  19.         if self.page < self.last_page:  
  20.             self.next_page = self.page + 1  
  21.         else:  
  22.             self.next_page = self.page  
  23.           
  24.         self.is_begin,self.is_end = False,False  
  25.         if self.page == self.first_page:  
  26.             self.is_begin = True  
  27.         if self.page == self.last_page:  
  28.             self.is_end = True  

 

Django的自定义标签除了基本的(也是经典的)标签定义之外,还提供了更方便的标签定义功能,包括我正在使用的Inclusion Tag。参考文档见这里:http://www.djangoproject.com/documentation/templates_python/#inclusion-tags。通过这种方式定义一个标签很简单。只需要用标签名写一个方法,然后注册到标签库就可以了。可以把标签的使用想象成方法的调用,本站的标签看起来是这样的:

 

python 代码
 
  1. from django import template
  2. def page_info(pager, url):
  3. return {'pager':pager,'url':url}
  4. register = template.Library()
  5. register.inclusion_tag('common/pagination.html')(page_info)

 

page_info 函数就是标签的处理函数,要求返回的是一个字典。这些字典里的值将作为上下文传到将要被Include的模板中,即Common/pagination.html。

自定义标签需要注意的一个地方:总是要把标签定义的程序文件放在App的templatetags目录下,在模板加载自定义标签的时候Django除了加载默认的还会到每个App的temlatetags目录下加载。

这样,标签定义好了,最后剩下要做的是完成我们的分页模板:

 

xml 代码
 
  1. <div id="pager">
  2. {% if pager.is_begin%}
  3. {%else%}
  4. <a href="{{url}}?p={{pager.first_page}}"><strong><<第一页strong>a>
  5. <a href="{{url}}?p={{pager.pre_page}}"><strong><上一页strong>a>
  6. {%endif%}
  7. {% if pager.is_end%}
  8. {%else%}
  9. <a href="{{url}}?p={{pager.next_page}}"> <strong>下一页>strong>a>
  10. <a href="{{url}}?p={{pager.last_page}}"> <strong>最后一页>>strong>a>
  11. {% endif %}
  12. div>

 

这些已经是分页模板的全部代码。当然,为了使用分页功能,某些列表的代码需要作相应的改动,包括使用上面定义的Pager类。

我是这样使用这个标签的:

 

xml 代码
  1. {% load pager %} {% page_info pager url %}

 

关于JSP标签的设想

本博客的程序好久没有动刀,今天晚上动起手来真是慢到抽筋(慢到要命)。写一个分页的标签折腾了半天。最后总算能交货。效果请看本博客的文章列表。目前展现方面还有点简陋,不过设计上已经支持前台各种展现方式。如1234567一样展开页码、用户输入页码跳转等。

看看时间,已经远远超过我所谓的早睡的界限了。详细的步骤明天再写一遍。

洗澡的时候想起JSP内置的Include标签,也想起Django内置的Extend标签,两者的实现是完全相反,但是在某些情况下使用Extend可以获得很大程序的灵活,至于JSP的Include标签的效果,Django已经支持--我的分页标签说白了就是一个Include。我在脑海中寻找有没类似Extend这样的jsp标签,Sitemeth不是,尽管他配置很少,但那一长串Exclude看见就恶心,Tiles更不用说。如此看来,自己开发一套Extend的标签也未尝不可,完全零配置,需要的时候才用。

所谓的Extend机制,想想类继承机制就清楚了。子类直接获得父类的东西,在页面上,子页面直接获得父页面所有内容,而且子页面可以重写(Override)某一个块的内容。Django的模板就是这么做的,Jsp如果也有这样一套Tag,那就可以抛掉那些所谓的装饰器了,一个Include一个Extend相当一开一合,妙。

有时间按Django的模板机制写一套标签玩玩,Maybe Jsp,也可能其他模板语言。

本系统完成用户数据与Django-auth的整合

编程 jeff  |  2007-09-30 1 pythondjango部署

抛弃原有用户模型、使用Django的用户、权限模型。数据迁移平稳,移植成功。涉及修改的有View,Decolator以及部分Template。

TODO是加上UserProfile,以及开始考虑帮捞捞把家搬到这里。还有最好可以加个手机日志,好让俺在旅游的时候可以。。嘿。。

Django的中间件

编程 jeff  |  2007-09-24 0 django中间件

中间件的名堂听起来很大。但在Django里面,中间件实际上就是一个过滤器(像Java的Servlet里面的Filter)。如果你需要在一个请求到来之后、View函数调用之前、在响应给客户端之前和View函数抛出异常的时候做些什么事情,那么你可以自己写一个中间件。

Django中间件必须是一个类,并实现四个接口,也就是必须提供四个方法:

process_request(self, request),只有一个请求作为参数,该方法在请求到来的时候调用。

process_view(self ,request, fnc , arg ,kwarg),在本次将要执行的View函数被调用前调用本函数。第一个参数为请求,二为将要执行的View函数实例,arg与kwarg分别为参数元组及参数字典。

process_response(self,request,response),在执行完View函数准备将响应发到客户端前被执行。

process_exception(self,request, exception). View函数在抛出异常时该函数被调用,得到的exception参数是实际上抛出的异常实例。通过此方法可以进行很好的错误控制,提供友好的用户界面。

官方指南:

一、中间件不需要继承任何类

二、你的中间件可以放在任何一个地方,当然前提是在Python的Path当中。Django只要在settings.py的MIDDLEWARE_CLASSES中找到它就可以了。

三、可以参考Django现有的中间件。

四、如果你写了些有用的中间件又觉得可以给其他人用,欢迎提交到Django,Django将考虑把它加入项目。

Bug!Bug?Bug.....

又遇到了灵异事件。。Django的ORM。orz.

昨天对Blog的程序进行了优化。见前一篇文章,因于文章分类允许为Null导致查询文章列表时(列表需要显示分类名)Select_related不起作用引发了1+N问题,所以我把Null=True去掉。减却了多余的N条查询。但是奇怪的事情发生了,我从早上开始发觉,首页列表的作者变成了Blog的Title。但代码明明是{{entry.author.name}}!我改成其他属性试下,依然是Print出Blog的其他属性。我回想昨天更新做过的改动,撒销均无效。最后想起会不会是因为改了Model的属性引起的,于是我把分类的Null=True加上。果然!显示正常了。这是为什么呢?不解!缓存?没可能吧?

我是不可能再把分类的Null=true保留的,因为实践证明这样对性能损耗太大。但不加上又出现属性值错乱的情况。怎么办?最后我作了个尝试,我把Model里面的属性调换了一下位置,原来Author在Catelog下方:

catelog = models.ForeignKey(Catelog,verbose_name='分类')
author = models.ForeignKey(Account,verbose_name='作者')

现在改回来,Author写在Catelog上方。显示正常。My god!

author = models.ForeignKey(Account,verbose_name='作者')
catelog = models.ForeignKey(Catelog,verbose_name='分类')

这是我的程序的Bug?还是Django的Bug?还是我的Bug?我想这个解决的办法不是好办法。

我拿到三种情况的Sql。一是分类为Null的查询,二是分类为NotNull的查询,三是分类为NotNull且Author属性排在Catelog前面的查询。结果是第一和第三种情况blog_account_name所在的列位置是一样的。这是否说明Django的确是记住查询结果的位置并且缓存起来了?但缓存到哪里了呢?如果刷新呢?

Meta

关于本博客...

关于黑莓手机、apple、twitter、互联网、web2.0以及生活的碎言碎语。请在twitter上 follow我,欢迎同好者talk to me bbmyth AT gmail.com。博客Hosting在 webfaction。

赞助商链接

我看我听我读

最新评论

标签

python 空间 开发 计划 年假 工作 诗歌 音乐 西片 恐怖 惊变 django mysql rss 文艺片 太阳 彩色 电影 apache 部署 factcgi lighttpd javascript editor MYMeditor sql 日志 java hibernate orm 数据库 英伦 摇滚 原创 中间件 朋友 erlang 并发 函数式编程 旅游 云南 丽江 发呆 学习 编程 技术 lucene 全文搜索 中文分词 乐队 模板 分页 成功 google pagerank 中文 更新 个性化 秋天 互联网 web ext json ajax 事业 职业 读书 开源 香港 澳门 忧郁 冬天 compass dvd 广州 地下 暴力 美学 声音玩具 独立 备份 数据 琐事 博客 生活 体验 卖唱 接口 设计模式 图表 wiki moin 遇窃 air ria 需求 设计 信息 健康 感悟 人生 真诚 life jquery 杭州 灾害 2008 中国 灾难 哀悼日 jmesa grails flex flash 捐赠 scrum 软件过程 快速开发 plone cms nuexo zope 左小诅咒 demo prototpye AMF actionscript 汉诺塔 算法 递归 结婚 感情 opensource 网络 beautifulSoup 管理 大理 香格里拉 休假 鼻炎 许巍 感性 2009 随想 cpug 聚会 出差 北京 api 创业 商城 blackberry 手机 TD 交流 处事 为人 房子 经济 手机仿真 在线服务 嵌入式 海鲜 p2p easymule apple 技巧 thing gtd task gfw vpn 穿墙 代理 软件管理 翻译 mac 英语 caffeine 休眠 搬家 主机 prism firefox mozilla 免费 php codeigniter url blogspot mindmap mindnode htmlparse easyurl 产品 黑莓 rim 试手机 豆瓣 twitter 微博 杂记 时空 亲人 dabr webfaction host 快速查看 safari appale 桌面 snow 升级 leopard finder 权限 glims python主机 合租 ruby主机 快捷键 itunes 时间管理 原型 画图 招聘 hosting 写作 软件 家庭 广州技术沙龙 postgres 云计算 fuckgfw 内容审检 谷歌 chrome linux odbc database freetds R 统计 书签 浏览器 bookmark tinymce 文件管理 分享 忙碌 旅行 马来西亚 图维导图 freemind 工具 pinax develope shell dropbox barcamp

日志分类

友情链接

博客归档

PowerBy