Write your first Django app 的翻译(不是直译!)
通过本指南,我们将带领您创建一个基本的投票应用。包含两个部分:
- 一个能查看投票项和进行选举的站点。
- 一个 Admin 站点,能让您添加、修改和删除投票项。
我们假设您已经安装好 Django 。您可以在命令行运行 python 解释器,然后输 入 import django,如果没有错误发生表明 Django 已经安装好了。
创建一个项目
如果这是您的第一次使用 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 足够多的信息做下面两件事情:
- 为 polls 创建一个数据表 (CREATE TABLE XXX)
- 创建 Python 数据库访问 API,以便于访问 Poll 和 Choice 对象
要激活 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: 什么事?>] >>>
