最近在使用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 继承和包含进来。这样便于以后的维护和扩展。因为重复=易错+难改。
No Comments Now!
Be the first to comment on this entry.