最近在使用Django开发一个小站点,初版要接近尾声了。由于初次使用,中间零零碎碎遇到不少问题,挑一些认为比较重要的问题。简单地总结一下。
1. 如何和前台人员配合?
项目中我负责后台和前台的javascript。另外一人写css代码,负责前台的显示。那么模板文件该如何维护,两人之间如何更好地配合,对此颇为伤神。这个主要涉及两个问题:
a. 谁负责维护模板文件?显然前台人员要参与进来。但我又要写js,有要保证有正确的数据扔到模板页面上。所以也同样需要不停地修改模板文件。所以,项目初期,不可避免都需要参与维护。这里我们的解决方案是:在svn上走两个版本,各自维护模板文件,然后每天去做一次归并。
b. 前台如何看到修改css后的效果?前台人员需要修改一点css代码,就可以立马看到效果,好进一步做不断地修正。如果手写填充,然后再有我根据填充的内容去替换成Django模板文件,这样出错的几率太大,最终又要返回给前台修改。针对这个我们采取的方法是:在前台人员的本机上也搭一个Django环境,和我的开发环境共用一个数据库。感谢Python的跨平台特性,让我很方便地在前台人员windows机器上也很顺畅地跑通程序。
2. 多读文档,细读文档
Django的文档还是蛮丰富的。几乎遇到的所有问题都可以从文档中得到解决。有时候就回过头来重读一下,就会发现对一些问题更好的解决方案,或者很细节但很重要的问题。试举几例:
a. 调用model的delete()方法,一定要多加注意。它会自动删除掉以该对象作为主键的其他关联对象。比如下面两组关系:


class  Article(model):
pass
class ArticlePicture(model):
article =  model.GenericForeignKey(Article)

删除掉article对象是,就会自动删除掉关联的ArticlePicture对象。
如果包含GenericRelation关系,则需要显示声明才能删除掉关联对象。比如:


class Article(model):
pass
comments = generic.GenericRelation(UserComment, object_id_field="object_pk")
class Comment:
content_type = models.ForeignKey(ContentType, verbose_name='content type')
object_pk    = models.PositiveIntegerField('object pk', db_index=True)
object       = generic.GenericForeignKey('content_type', 'object_pk')

body = models.TextField(max_length=COMMENT_MAX_LENGTH, verbose_name="评论内容")

对于这种,comments = generic.GenericRelation(UserComment, object_id_field=”object_pk”) 才叫显示声明。删除Article就会删除指向它的所有相关评论。一切都是如此地方便,不用多操心!
b. 模板中的for标签。for标签远不止一个循环那么简单。还提供了不少很贴心的功能。比如forloop.first ,它可能判定那个元素是这个序列中的第一个。这个有时候非常关键,比如我们要一个切tab的操作。我一开始是这么做的:


{% for item in items %}
{% if item.is_first %}
<div class="first">{{ item.something }}</div>
{% else %}
<div >{{ item.something }}</div>
{% endif %}
{%  endfor %}

我就必须在views函数中,将序列中第一个元素:
items[0].is_first = True
这样的操作。虽然python的动态特性,很方便地解决了这个问题,但整个代码显得非常丑陋。细读文档,发现有forloop.first,这样就简单,优雅多了,如下:


{% for item in items %}
{% if forloop.first %}
<div class="first">{{ item.something }}</div>
{% else %}
<div >{{ item.something }}</div>
{% endif %}
{%  endfor %}

所以,一定要没事多读文档!
3.  模块化,不光是程序,还包括模板。

Django的按照app和template天生就具备极强的模块化特性。整个结构看起来非常规整,有序。仔细划分项目的功能,将不同的app分化出来,app的共同部分还而已抽取出来。另外对于模板文件,应该分析整个页面元素的特性,尽量把不同的内容独立出来,然后用extend 和 include 继承和包含进来。这样便于以后的维护和扩展。因为重复=易错+难改。

Tags: .
首页

No Comments Now!

Be the first to comment on this entry.

请您留下评论

名称(必填)
Mail (必填),(will not be published)
网站(recommended)

Fields in bold are required. Email addresses are never published or distributed.

Some HTML code is allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
URLs must be fully qualified (eg: http://www.hongzhixiong.com),and all tags must be properly closed.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.