• 2009-06-15

    Python的高级特性在Django中的使用 - [Python]

    好久没有去看xlp223的博客了,今天偶然逛进去,发现自己原来错过了一本很好的讲解Django的书《Pro Django》。之前看到过这本书,但是,感觉上可能跟其他的Django的书差不多,就错过去了。看了看xlp223翻译的第二章,觉得很值,就像元创的评论,这本书有助于理解Django的源码...

    前面尝试使用Django/Python也有一段时间了,但是,很多高级特性,尤其是元编程这部分,还不是很清楚,现在看起来xlp223翻译的这章,比之前看的其他的讲解的都好。

    又要补课了...

    Tag:python django
  • 2009-05-12

    Django & Flex - [Python]

    玩Python和Django也有一度时间了,周日的时候,看到INFOQ上有一篇Bruce Eckel谈Python/Flex/RIA的文章(如果你不记得BE是谁的话,回去翻翻Thinking in Java吧,:)),谈到了他与Adobe公司的人合写的一本书《First Steps in Flex》,勾起了我对于Flex的兴趣。之前对于FLEX的了解不多,因为不想过多的去学习ActionScripts,所以并不深入。上网查了查,好像目前在大型项目中对于FLEX的应用,在性能方面不是很理想。不过,对于小型的产品,尤其是很多BI/Reporting的解决方案,基于Flex的见得不少。

    目前我的开发环境基本上是倾向于Ubuntu,不过,UNIX下面的好的Flex的IDE Flex Builder是要钱的,开源的Flash Develop又是基于.Net的,可能还是用Vim来写吧。

    网上很容易查询到Django/Python与Flex集成的资料,利用pyamf,来写Django端的service比较容易,可以参考这个文章。回头有时间的话,可以考虑为TCM写个Flex的客户端。

    BTW: 这篇文章介绍的Vim开发Flex的环境停详细的,值得借鉴。

  • 2009-04-20

    [备忘]Django的开发工具 - [Python]

    Python的应用开发与发布,也是有些比较成熟的工具,buildout应该算是其中的一个。今天,看到一个帖子,详细了说明了使用buildout来进行一个django应用的开发工作,值得学习。

    Tag:django python
  • 2009-02-16

    TCM项目进展_0216 - [Python]

    这几周公司的事情实在是太多了,TCM项目的紧张不大,时间都化在熟悉jQuery的语法上了,好久没有用,荒废了...

    目前已经实现了一个中药在经方中使用频率的页面,还有几个就是选择几个中药来查询使用的经方。截图分别如下:

    方根查询页面:

    中药使用频率:

    今天又强化了以下Python的语法:

    1. map & lambda: map(lambda item:item.json(), self.fanggen_items)
    2. unicode/str: 如果返回的字符串是UTF-8编码的话,字符串的操作还是应该用unicode而不是str方法
    3. list排序: sorted(self.fanggen_items, key = lambda item: item.medical_id)

    还有就是Django的json处理:

    TCM中进行ajax调用的时候,返回的对象往往不是model,是另外的view中的class。这样,不能直接调用'serializers.serialize'来处理queryset,需要将需要返回的对象转化为dict。如果view中处理的是个对象的list的话,我的做法是为每个对象实现json方法,返回{}。

    map(lambda item: item.json())

    Tag:Python Django
  • 2009-02-05

    TCM项目启动 - [Python]

    昨天晚上想起来的,准备做个学习中医的Django的Project-TCM(Traditional Chinese Medical)。一则希望借机熟悉Django1.0之后的admin的用法,同时,熟悉ropvim/pysmell等等在vim中的使用;二则,把《伤寒论》的112方输入到系统中去,可以更加方便的查询方剂的构成,每味中药出现的频率,中药组合(方根)的频次等等。这些都可以增加随机的测试,来增强自己对于方剂的记忆。以后,可以慢慢的把《金匮要略》《时方妙用》《神农本草经》等等的内容也加入进去。

    Django的admin功能作的算是比较强了,基本的CMS的功能都有了,而且,定制性比较强。今天在作的时候,碰到了一个问题是,在添加/更新方剂的时候,报unicode的问题,不是每个方剂都报,而是其中的某几个报。后来,我发现是因为model的__unicode__方法如果使用了format输出的方式,一定要添加unicode的声明(u)...,其实是个很简单的错误,在django的文档中有说明,我自己给忘记了。

    def __unicode__(self):

        return u"%d %s" % (self.quantity, self.medical)

  • 2008-12-30

    Ubuntu下基于Vim的Django开发环境(pysmell, SnippetsEmu) - [Ubuntu]

    这几天在看Django的一些书籍,因为在Ubuntu下面,还是希望能够充分利用Vim来进行Django的开发,而不是依赖Eclipse或者NetBeans。这样强迫自己,可以更好的利用键盘和文本编辑器来进行开发工作。上午跟老板在谈一些开发的时候,因为他一直比较强调这些脚本语言,文本编辑器等等的重要意义,更加坚定了我在Ubuntu下利用Vim的信心。不管如何,还是先试试吧。

    我主要参考的是这篇文章来进行环境的设定,主要是利用了pysmell和SnippetsEmu,基本的步骤如下:

    1 实现安装Python的安装工具:apt-get install python-setuptools

    2 sudo easy_install pysmell

    3 按照pysmell主页上的介绍,把pysmell.vim复制到.vim/plugin目录,然后,再修改.vimrc中的python的omnicomplete用pysmell

    4 到python2.5的目录(/usr/lib/python2.5),生成django和Python的标准库的tags: sudo pysmell . -x site-package test -o PYSMELLTAGES.pythonlib; sudo pysmell site-package/django -o PYSMELLTAGES.django

    5 cp PY*.* ~/DJANGOPROJECTS/

    6  pysmell . -o PYSMELLTAGS

    经过以上的步骤,pysmell就可以用了,ctrl+X/O就可以看到IDE中的代码提示,很COOL。

    安装SnippetsEmu的过程也比较容易,到它的主页下载两个vba文件,用vim打开,运行:os %,就可以安装好了。然后,再去下载页面下部的urls和views的vim文件,复制到./vim/after/ftplugin目录。最后,在这个目录下生成一个python.vim文件,如果你想比较严格的进行限定views.vim只能在view文件下运行,可以添加判断,不过,我还是喜欢把所有的django相关的vim文件都装载,这样比较简单(可以参照这个文章的范例)。

    runtime! ftplugin/*django*_snippets.vim 

    ok,这样,我就又找回了像原来使用IntelliJ IDEA的乐趣了...

  • 2008-12-29

    《Practical Django Projects》不错 - [Python]

    这几日有些时间,在Ubuntu下面的Django/Python开发环境也都好了,就想把Django再好好看一看。之前有DL过《Practical Django Projects》,就按照它的例子,看了3章,比较实用,使得我对于contrib下的admin和flatpages有了更输入的了解。Django宣传中的admin应用确实不错,和flatpages结合起来,可以用来制作一些非常简单的页面了。

    自己在做定制flatpapges的admin页面的时候,犯了一个错误,无论如何也没有办法装载tinymce的效果。用firebug发现,确实是js文件找不到...最好才发现,自己的urls.py里面的顺序有问题。为了支持flatpages,需要加入以下一项:

    (r'', include('django.contrib.flatpages.urls')),

    这样,就通过flatpages来访问所有的url。需要注意的是,要把这项放在最后一个,也就是需要在admin和tiny_mce的后面。

     (r'^admin/(.*)', admin.site.root),
     (r'^tiny_mce/(?P<path>.*)$', 'django.views.static.serve', \
    { 'document_root':'/home/johnson/workfolder/tinymce/jscripts/tiny_mce/', 'show_indexes': True }),
    (r'', include('django.contrib.flatpages.urls')),

    真是大意失荆州啊!

    Tag:Django
  • 2007-07-30

    [Django]备忘两则 - [Python]

    今天看到Django的status udpate,除了上次提到的那个Django Master Class以外,还有两篇好玩的东西,第一是Django Check Constraints,另外一个是Best Practices to Work with 3rd Party Apps

    都是不错的,明天试试看。 

    Tag:Django
  • 2007-05-25

    [Django]PIM的Worklog改进 (jQuery动态刷新下拉框) - [Python]

    今天继续完善PIM的Worklog的功能,主要是利用Ajax实现了一个两层下拉框的动态刷新。在我增加计划任务的时候,希望选择了任务类型之后,对应的默认任务列表会刷新。

    首先,将选中的计划任务利用jQuery的ajax方法传道后台。

    $(document).ready(apppend_refresh_task_event);
    function apppend_refresh_task_event() {
    $("#id_tasktype").change(
    function() {
    tasktype = this.options[this.selectedIndex].value;
    $.ajax({
    url: "/worklog/refresh_task/",
    type: "post",
    data: "tasktype=" + tasktype,
    dataType: "json",
    complete: function(msg) {
    task_options = eval(msg.responseText);
    refresh_task(task_options);
    }
    });
    }
    );
    }

    其他, 在后台的view中按照条件进行过滤数据,然后,传回JSON对象。这里碰到了一个问题,就是怎么样过滤Null的数据,一开始我是使用model.objects.filter(field=None),不行;后来查了文档,应该使用isnull方法,于是就修改成了model.objects.filter(field__isnull = True)。获取了合适的queryset之后,因为,我需要动态刷新下拉框的options,不需要将所有的数据都传回去,加上我也行自己处理queryset,不直接使用serializers.serialize。于是,就做了如下处理:

    for task in queryset:
    tasks.append({'id': task.id, 'name': task.name})
    from django.utils import simplejson
    #json = serializers.serialize('json', queryset, ensure_ascii = False)
    json = simplejson.dumps(tasks, ensure_ascii = False)

    这里是使用了django内的simplejson,也比较方便,对于unicode的支持也跟serializer一样。

    最后,就是根据获取的数据进行动态修改下拉框的options。我是在网上找了一个jQuery的selectboxes的Plugin,还算好用。

    function refresh_task(task_options) {
    if (task_options.length > 0) {
    taskname_control = $("#id_taskname")
    taskname_control.removeOption(/./);
    for (i in task_options) {
    taskitem = task_options[i];
    taskname_control.addOption("" + taskitem.id, taskitem.name);
    }
    taskname_control.selectOptions('', true);
    }
    }

     

    Tag:Ajax Django
  • 2007-05-24

    [Django]Model的一些问题 - [Python]

    回来已经有段时间了,还没有静心来完善之前的PIM系统。前面是在看《Ajax in Practice》,写的还不错,第三章对于JS的特性的描写是我之前所不知道的,也算有所收获。剩下的就是把后续的章节看完,结合PIM,来运用一下吧。

    今天的修改主要是针对worklog部分,有两个问题。第一个是,Model之间有foreignkey的关系,但是,在维护界面,需要针对某些条件进行过滤。Model的field定义中提供的option有一个limit_choices_to,但是,目前提供的方式太死板,只能进行日期等的过滤。文档说是可以利用Q对象来进行扩展,但是,我没有试验成功,:(网上查查,也只有这篇文章的方式了。后来是自己修改了之前写的newforms的封装类,为base_add_edit的generic view增加了一个limit_choices的context,这样就可以定制了,又不需要增加额外的代码。

    第二个问题是,TaskActual模型与TaskPlan有外键关联,如果增加了某个跟TaskPlan关联的TaskActual,需要更新TaskPlan的状态为已经完成;同时,如果删除了某个TaskActual,则需要将关联的TaskPlan的状态置为未完成。这些操作,都可以通过在Model中重载save或者delete的方法来进行,而且,也应该在model层次进行。

    Tag:Django