子非鱼,安知鱼之乐?

我的程序人生,累并快乐着。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Django学习笔记

Posted on 2006-10-27 21:20  Jason Cui  阅读(599)  评论(0编辑  收藏  举报

研究了一星期了,有点入门,但是始终是做的太慢。可能最近脑袋不太灵光了,学习东西很慢。也可能是被微软的IDE给宠坏了,习惯了复制粘贴,脑袋已经很久没有去记东西了。而Python的语法又不熟悉,Django的内核也不了解,所以很多东西都要去Google一下才能写下去。为了增强记忆,也顺便整理一下自己的思路,写篇学习笔记。新手可以作为入门参考。

Django以Project为项目组织单位,项目里面可以建多个app。如果你想以project作为整个网站的全部,那么app就是这个网站里的目录。每个app里面包含models和views两个文件。可以自己增加其它的文件,可以随便引用。models里面是这个app的类定义,或者叫数据表映射的定义。views是逻辑过程,比如处理数据,然后传给前面的模板,或者处理页面上Post过来的数据。从这一点上讲,Django的逻辑远不如Ruby On Rails清晰。

模板文件可以放在任何地方,如果整个project使用一套模板,可以在project目录下建Templates目录,所有的模板文件都扔进去,如果每个app使用独立的模板,就在每个app下建一个Templates目录,然后需要到settings.py里指定模板文件的目录,当你在view里调用模板的时候,会按照这里设置的目录去遍历,直到找到为止。

页面的显示过程:当服务器接收到一个传入的请求,首先到project的urls.py里去找该路径所对应的映射,如果找到,就调用里面定义的app.views.func。views里面定义的函数必须返回Response对象。在这个函数里可以做数据库的运算等等,最后Render一个模板。也就是把生成的变量传入模板文件,然后处理模板文件里面的参数。

Django的模板是可以继承的。通常的需求是建立一个Framework.html,里面包含一些共有的东西,然后每个页面都有自己的标题和主内容,这时候就可以在Framework里面定义几个block,然后在每个模板里面extend这个模板,然后在里面实现对应的block,比如Title和Content。如果子模板没有实现对应的block,会直接使用父级模板里面的这个块的默认内容,所以这样就可以把一些共性的东西放在框架里,而某些特殊的页面也有权利覆盖这些内容。即使你前期没有定义这一块为block,日后有页面出现这种需求的时候,把它改成block,也不需要去修改以前的所有页面。

另外,在view里面render一个模板的时候,传入的变量只有这个模板能接收到,父级模板是无法接收的,那么一些跟参数有关的内容怎么办?

Django提供了两种扩展模板的方式,filter和tag。两种都是函数,只是返回值和功能上有一点区别。在app目录里建一个templatetags目录,里面加上__init__.py,也就是把这个目录变成一个包。(如果这里面要定义的函数需要在所有的app的模板里面用到,那么可以在project目录建一个目录,只包含一个__init__.py和templatetags目录。在templatetags目录下增加包含函数的文件,文件名就是你将来要在模板里面load的时候的名字,比如文件名是my_func.py,将来就可以在模板里面使用{% load my_func %},然后就可以在模板里面直接使用文件里定义的函数了。

filter和Tag的参数定义基本一致,但是filter只能返回字符串,用来显示在页面里,使用方式是{{ myvar|filtername }},这样就会将myvar这个变量传给这个函数,此处的显示变成处理后的内容。函数过程中不能出现异常。tag功能更强,而且有simple_tag和inclusion_tag两种增强型的,后者可以处理另外一个模板文件。比如许多页面上可能会显示最新十篇文章的列表,这个通常就可以用tag来处理,因为在tag里,不但可以调用其它的model,还可以像view一样render一个模板。最后只要在模板文件里面使用{% tagname %},这里就会生成一个列表了。还可以加参数,方便的控制要显示的条数。

如果要在view里将参数传递到tag里,或者父模板里,可以使用RequestContext,相当于超全局变量,所有的模板里都可以直接使用该变量。