Write your first Django app 的翻译(不是直译!)

通过本指南,我们将带领您创建一个基本的投票应用。包含两个部分:

我们假设您已经安装好 Django 。您可以在命令行运行 python 解释器,然后输 入 import django,如果没有错误发生表明 Django 已经安装好了。

创建一个项目
开发中使用的 web 服务器
使用数据库
创建 models
激活 models
玩玩 API

创建一个项目

如果这是您的第一次使用 Django , 您需要使用一些初始化工具帮主您开始 Django 之旅。

从命令行进入一个目录,在命令行输入 "django-admin.py startproject mysite" 。这样在当前目录会创建一个 "mystie" 的目录。

注意:如果输入命令发生错误,请检查 Django 是否安装好,django-admin.py (有些系统上没有后缀 .py)命令所在的目录是否在 $PATH 变量中。

mysite 目录通常结构是这样的:

mysite
|-- __init__.py
|-- manage.py
|-- settings.py
`-- urls.py

含义如下:

__init__.py
一个空文件,告诉 Python 这个目录要被当作一个 Python 模块。
manage.py
一个和 Django 项目交互的实用工具,我们后面会一直用到。
settings.py
Django 项目的配置文件。
urls.py
用 Django 开发的站点的 Web 访问接口。

开发中使用的 web 服务器

Django 内置一个简易快捷的 web 服务器,在开发和测试阶段,强烈建议使用这 个 web 服务器。 Django 项目的每一个改动,这个 web 服务器都能自动检测 到,并自动重启 web 服务。

要使用这个 web 服务器,进入刚才创建的 mysite 目录,运行 "python manage.py runserver" 。如果看到类似下面的信息,说明启动正确:

$ python manage.py runserver
Validating models...
0 errors found

Django version 1.2 pre-alpha SVN-11479, using settings 'mysite.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

在浏览器中输入 http://127.0.0.1:8000 即可访问这个 web 服务器。现在我们 什么都还没有,您将看到 "Welcome to Django" 页面。

可以改变默认的 8000 访问端口:

python manage.py runserver 8080

也可以让局域网其他机器访问:

python manage.py runserver 0.0.0.0:8000

使用数据库

Django 就是为开发数据库驱动的Web应用而产生的。在 Django 中使用数据库非 常简单,只要配置好数据库访问,其他访问细节全不需要考虑。

本指南内我们只使用 sqlite3 数据库,这是最简单的数据库。配置也非常简单, 打开 mysite/settings.py 文件,设置 DATABASE_ENGINE 为 "sqlite3" , DATABASE_NAME 为 "every_name_you_like.sqlite3" ,其他都不要设置,也不需 要您再担心数据库的问题了。

现在运行 "python manage.py syncdb" 命令,就可以根据 mysite/settings.py 中 INSTALLED_APPS 设置的内容初始化数据库。

默认的 INSTALLED_APPS 是这样:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
)

当我们第一次运行 "python manage.py syncdb" 命令时,会提示我们创建一个超 级用户,设置密码,填写 email 信息。以后只要添加有数据库模型的 app 到 INSTALLED_APPS 中,都要再次运行这个命令更新数据库。

创建 models

我们使用 "django-admin.py startproject mysite" 创建了一个目录 mysite , 在 Django 中我们称 mysite 为一个 project 。project 一般就是一个 web 站 点,包含一个配置和多个 app 。一个 app 就是 project 中的一个具体应用。比 如我们的站点可以包含 blog , bbs 等多个 app 。

本指南,我们在 mysite (project) 目录中创建一个 pools (app),在 mysite 目录下执行:

python manage.py startapp polls

查看 pools 目录:

polls/
|-- __init__.py
|-- models.py
|-- tests.py
`-- views.py

目录结构很简单 :

__init__.py
让 Python 把这个 polls 目录当作一个模块。
models.py
app 中的数据库模型都写在这里。
tests.py
新的版本代一个测试框架。
views.py
视图文件,web接口对应的处理函数。

写一个数据库驱动的web应用的首要任务就是在 models.py 中定义 app 的数据库 模型。本指南的 polls 应用包含两个简单的 models : polls 和 choices 。

一个 poll 有一个问题和一个日期。一个 choice 有两个方面:choice的文本信 息及选举计数。编辑 polls/models.py 文件如下:

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()

激活 models

上面 models.py 文件中的代码给了 Django 足够多的信息做下面两件事情:

要激活 models ,我们添加 "mysite.polls" 到 mysite/settings.py 文件中以 告诉 Django 我们已经安装了这个 app。

运行 “python manage.py sql polls” 可以看到 Django 将要为 polls 创建怎样 的数据表:

BEGIN;
CREATE TABLE "polls_poll" (
    "id" integer NOT NULL PRIMARY KEY,
    "question" varchar(200) NOT NULL,
    "pub_date" datetime NOT NULL
)

CREATE TABLE "polls_choice" (
    "id" integer NOT NULL PRIMARY KEY,
    "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"),
    "choice" varchar(200) NOT NULL,
    "votes" integer NOT NULL
)

COMMIT;

上面的 sql 语句因使用的数据库不同也会有所不同。这个命令仅仅显示 Django 会为 polls 应用创建数据库的 sql 语句,不会真正的执行。真正执行,运行命 令 “python manage.py syncdb"

$ python manage.py syncdb
Creating table polls_poll
Creating table polls_choice
Installing index for polls.Choice model

玩玩 API

使用命令 "python manage.py shell" 我们可以进入 Django 项目的交互模式。

jianlee@localhost:~/lab/django/mysite$ python manage.py shell
Python 2.6.2 (r262:71600, Aug 21 2009, 12:22:21)
[GCC 4.4.1 20090818 (Red Hat 4.4.1-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from mysite.polls.models import Poll, Choice # 加载 model
>>> Poll.objects.all()
[]
>>> import datetime
>>> p = Poll(question="什么事?", pub_date=datetime.datetime.now())
>>> p.save()
>>> p.id
1
>>> p.question
'\xe4\xbb\x80\xe4\xb9\x88\xe4\xba\x8b\xef\xbc\x9f'
>>> print p.question
什么事?
>>> p.pub_date
datetime.datetime(2009, 9, 8, 9, 51, 42, 452025)
>>> p.pub_date = datetime.datetime(2007,4,1,0,0)
>>> p.save()
>>> Poll.objects.all()
[<Poll: Poll object>]
>>>

上面, Poll.object.all() 输出的信息对我们没有什么意义,修改 polls/models.py 文件,在每个 class 下面添加一个 __unicode__() 方法 :

class Poll(models.Model):
    # ...
    def __unicode__(self):
        return self.question

class Choice(models.Model):
    # ...
    def __unicode__(self):
        return self.choice

现在在看看:

jianlee@localhost:~/lab/django/mysite$ python manage.py shell
Python 2.6.2 (r262:71600, Aug 21 2009, 12:22:21)
[GCC 4.4.1 20090818 (Red Hat 4.4.1-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from mysite.polls.models import Poll,Choice
>>> Poll.objects.all()
[<Poll: 什么事?>]
>>>