您还没有登录。现在登录注册

Django1.0阿尔法发布

分类: 编程   |   jeff  发表于:2008-07-23 17:14:46  |   2条评论  |

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

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

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

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

更新日志

分类: 编程   |   jeff  发表于:2007-11-19 02:10:22  |   0条评论  |

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

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

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

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

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

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

Django分页方案

分类: 编程   |   jeff  发表于:2007-10-29 01:02:21  |   3282条评论  |

本文描述的是本站的分页方案。
由于分页功能在列表的地方通常会用到,所以最理想的分页方案实现应该是使用简单、可重用性高的。正如我希望在显示一个分页信息是通过下面的代码来实现:{% 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标签的设想

分类: 编程   |   jeff  发表于:2007-10-26 01:04:01  |   1条评论  |

本博客的程序好久没有动刀,今天晚上动起手来真是慢到抽筋(慢到要命)。写一个分页的标签折腾了半天。最后总算能交货。效果请看本博客的文章列表。目前展现方面还有点简陋,不过设计上已经支持前台各种展现方式。如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 01:46:42  |   1条评论  |

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

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

Django的中间件

分类: 编程   |   jeff  发表于:2007-09-24 22:59:19  |   0条评论  |

中间件的名堂听起来很大。但在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.....

分类: 编程   |   jeff  发表于:2007-09-20 00:14:08  |   2条评论  |

又遇到了灵异事件。。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的确是记住查询结果的位置并且缓存起来了?但缓存到哪里了呢?如果刷新呢?

站内搜索

作者简介

jeff

OK Computer!

mail
qq

订阅我

我看我听我读

都有谁评论鸟

Tags

日志分类

友情连接

Power By