django开发小记


最近尝试用django开发一个叫做vmm的虚拟机管理网站。以下是我在第一次使用django开发较完整网站时学到的东西。

TIME_ZONE

首先是发现django在显示datetime时与预期不太一样,比如下午2点时页面上直接输出datetime显示为早上6点。多多少少决定和时区设置有关系。从Dash看了django的时区配置,发现在网站的settings中有TIMEZONE这一选项,默认是UTC。据文档上上默认是加拿大的时区……所以把TIMEZONE改成上海就行了。

TIME_ZONE = 'Asia/Shanghai' # default is UTC

模型和数据库表的同步

开发web最常做的事情莫过于和数据库打交道,django的syncdb和rails等全栈式的web框架的应用到数据库的同步类似,很大得方便了数据库操作。
使用步骤主要如下:
设定models.py中的模型

class MachineTemplate(models.Model):
    name = models.CharField(max_length = 255)
    description = models.TextField()
    planned = models.IntegerField(default = 0)
    used = models.IntegerField(default = 0)

在settings.py中加入模型所在的app

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'machine',
)

最后执行./manage.py syncdb
顺便说一句,如果做了不是新增字段的修改,比如去除某个属性,去掉某个模型之类的,那么可以使用./manage.py flush重建表。不过所有数据都会没有。另外一种方法是通过数据库工具修改表结构。

admin界面

似乎是django独有的一个功能,天生提供一个admin界面管理数据模型。所以只要你建立了一个模型,并加入admin界面,就可以在admin界面上像在后台一样操作这些数据。加入方法是:

from django.contrib import admin
from machine.models import MachineTemplate

class MachineTemplateAdmin(admin.ModelAdmin):
    list_display = ('name', 'planned', 'used')

admin.site.register(MachineTemplate, MachineTemplateAdmin)

最后语句register执行模型的注册。list_display控制admin界面模型显示的列。
另外,admin界面显示外键数据(比如在显示书的出版商)可以在模型的__unicode__方法上控制

class MachineTemplate(models.Model):
    name = models.CharField(max_length = 255)
    description = models.TextField()
    planned = models.IntegerField(default = 0)
    used = models.IntegerField(default = 0)

    def __unicode__(self):
        return self.name

模板与静态文件位置

和app结合来看,模板与静态也可以类似app一样分模块,有层次关系,即公共模板与个别模块的模板等等。
不过考虑到代码中还是要通过app名区分模板,所以把模板和静态文件分离到各个模块下就不是非常有必要了。
个人使用的模板和静态文件位置配置很简单,在settings.py中:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)

以上就是个人最近学习django的一点心得。