安装
根据 django 官方文档, 需要 python 2.3 或更高版本. 不过按现在的 python 普及程度, 想必大家的机器上都有 python 2.5 或 2.6 了. 我的操作系统是 ubuntu 9.10, 自带的是 2.6 版本.debian 用户安装 django 很简单, 只需要
# apt-get install python-django
就可以了, 其它发行版看有没有类似的方法. 或者在官方站点下载源代码安装
祝好运.
建立项目 startproject
首先找到一个地方, 建立一个项目 guestbook, 我们将在这个项目中搭建一个留言板.$ django-admin startproject guestbook
有些系统中
django-admin
并非一个命令, 需要$ python django-admin.py startproject guestbook
执行完这个之后, 当前目录下会创建一个名为 guestbook 的目录, 里面包含了一个最简单的服务器: 显示一个主页. 执行
$ python guestbook/manage.py runserver
启动后会看到类似以下输出
Validating models...
0 errors found
Django version 1.1.1, using settings 'guestbook.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
为 guestbook/manage.py 加上可执行属性 (在 ubuntu 9.10 下该属性已经自动添加了)
$ chmod u+x guestbook/manage.py
创建应用 startapp
在 django 世界的哲学里, 每个功能称之为一个应用. 创建应用也使用 manage.py 来完成. 比如现在用以下命令创建一个首页应用$ guestbook/manage.py startapp home
这时 guestbook 目录下会多出一个 home 目录, 里面有这些文件
__init__.py
models.py
tests.py
views.py
比较烦的是, 这时得回去修改设置, 打开 settings.py 查找
INSTALLED_APPS
, 在这一坨里面加一行INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'guestbook.home',
)
from django.http import HttpResponse
def display(req):
return HttpResponse('<html><body>hello, django!')
urlpatterns = patterns('',
# Example:
# (r'^guestbook/', include('guestbook.foo.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
# (r'^admin/', include(admin.site.urls)),
(r'^$', 'guestbook.home.views.display'),
)
现在再来访问 http://localhost:8000/ 出现的就是…
PS: 无须重启服务器.
使用模板
将 html 直接写在源代码里面是一件很怪的事情, 我们可是 python 程序员呢.解决的方法呢, 就是把 html 里面固定的部分写在 html 模板文件中, 然后在 python 逻辑中处理动态的部分. 废话少说, 现在开始. 首先打开 guestbook/settings.py, 找到
TEMPLATE_DIRS
, 在注释丛中添加模板搜索目录TEMPLATE_DIRS = (
# Don't forget to use absolute paths, not relative paths.a
'guestbook/views',
)
现在, 再潜入 views 目录, 建立模板文件 home.html, 内容
<html>
<body>
Hello, {{ message }}!
{{ message }}
就是将在逻辑部分被动态替换的变量.最后, 重写视图逻辑. 修改 guestbook/home/views.py
from django.shortcuts import render_to_response
def display(req):
return render_to_response('home.html', {
'message': 'django template'
})
render_to_response
第一个参数是模板文件名, 第二个参数是一个映射, 将模板中的变量 message
映射为字符串 django template
.现在刷新页面吧.
处理表单
上面display
函数的第一个参数, 也就是 http 请求, 它包含了页面请求信息. 这个参数使不能省的.接下来在 views 目录下创建一个 echo.html 文件, 由它向服务器提交请求
<html>
<body>
<form action='/' method='get'>
<input type='text' name='name'/><br>
<input type='text' name='content'/><br>
<input type='submit' value='提交' />
</form>
<html>
<body>
{{ name }} 刚才说到: {{ content }}
urlpatterns = patterns('',
# Example:
# (r'^guestbook/', include('guestbook.foo.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
# (r'^admin/', include(admin.site.urls)),
(r'^$', 'guestbook.home.views.display'),
(r'^echo/$', 'guestbook.home.views.echo'),
)
def display(req):
return render_to_response('home.html', {
'name': req.GET['name'] if 'name' in req.GET else '',
'content': req.GET['content'] if 'content' in req.GET else '',
})
def echo(req):
return render_to_response('echo.html', {})
PS: 因为 echo.html 中表单提交用的是 get 方法, 所以处理时使用的是
req.GET
成员; 如果用 post 方法, 则对应于 req.POST
.下节看点 – ORM 与数据库