1.开始运行一个项目(Starting a project)
django-admin.py startproject mysite(mysite表示项目的名称)
2。manage.py runserver启动服务
python manage.py runserver 0.0.0.0:8080
3.创建一个Wiki
manage.py startapp wiki
4.
与数据库的交互学习例子
在web/apps/models.py
from
django.db
import
models
class
Publisher(models.Model):
name
=
models.CharField(maxlength
=
30
)
address
=
models.CharField(maxlength
=
50
)
city
=
models.CharField(maxlength
=
60
)
state_province
=
models.CharField(maxlength
=
30
)
country
=
models.CharField(maxlength
=
50
)
website
=
models.URLField()
创建了一个模型
其中有六个字段例如Publisher模型对应了下面的表(假设使用PostgreSQL的CREATE TABLE语法):
代码
CREATE TABLE "books_publisher" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30) NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
);
#在配置文件中激活模型,添加了 'apps.Publisher',django就会自动生成相应的表
INSTALLED_APPS
=
(
'
django.contrib.auth
'
,
'
django.contrib.contenttypes
'
,
'
django.contrib.sessions
'
,
'
django.contrib.sites
'
,
'
django.contrib.admin
'
,
'
django.contrib.markup
'
,
'
apps.books.Publisher
'
,
像下面这样运行syncdb命令:python manage.py syncdb
你会看到如下信息:
Creating table books_publisher
Installing index for books.Book model
syncdb简单的把你的模型同步到数据库
数据访问基础
一旦你创建了一个模型,Django自动提供高级Python API给这些模型工作
运行python manage.py shell然后输入下面的代码试试:
代码
>>>
from
books.models
import
Publisher
>>>
p
=
Publisher(name
=
'
Apress
'
, address
=
'
2560 Ninth St.
'
,
... city
=
'
Berkeley
'
, state_province
=
'
CA
'
, country
=
'
U.S.A.
'
,
... website
=
'
http://www.apress.com/
'
)
>>>
p.save()
>>>
p
=
Publisher(name
=
"
O'Reilly
"
, address
=
'
10 Fawcett St.
'
,
... city
=
'
Cambridge
'
, state_province
=
'
MA
'
, country
=
'
U.S.A.
'
,
... website
=
'
http://www.oreilly.com/
'
)
>>>
p.save()
>>>
publisher_list
=
Publisher.objects.all()
>>>
publisher_list
[
<
Publisher: Publisher object
>
,
<
Publisher: Publisher object
>
]
url和视图
URL配置搜索什么
当一个请求过来,Django试图把URL当作普通的Python字符串而不是Unicode字符串来和URL配置模式匹配
这不包括GET或POST参数,或者域名,它也不包括第一个斜线,因为每个URL都以斜线开头
例如,对http://www.example.com/myapp/的请求,Django将试图匹配myapp/
对http://www.example.com/myapp/?page=3,Django将试图匹配myapp/
在解析URL配置时请求方法,如POST,GET,HEAD不会给予考虑,换句话说,对于一个URL的所有的请求
方法将被路由到同一方法,根据请求方法处理分支是视图方法的责任
引入其它URL配置
你的URL配置可以引入其它的URL配置模块,例如:
代码
from
django.conf.urls.defaults
import
*
urlpatterns
=
patterns(
''
,
(r
'
^weblog/
'
, include(
'
mysite.blog.urls
'
)),
(r
'
^photos/
'
, include(
'
mysite.photos.urls
'
)),
(r
'
^about/$
'
,
'
mysite.views.about
'
),
)



这里有一点很重要:这个例子中指向inclue()的正则表达式不包含$(字符串结尾匹配符),但是包含一个
末尾的斜线
每当Django遇到include()时,它将截断匹配的URL并将剩下的部分转交给include的URL配置继续处理
继续这个例子,下面时mysite.blog.urls:
代码
from
django.conf.urls.defaults
import
*
urlpatterns
=
patterns(
''
,
(r
'
^(dddd)/$
'
,
'
mysite.blog.views.year_detail
'
),
(r
'
^(dddd)/(dd)/$
'
,
'
mysite.blog.views.month_detail
'
),
)
通过这两个URL配置,下面是一些将被处理的请求的例子:
1,/weblob/2007/,在第一个URL配置里,模式r'^weblog/'会匹配,因为它是一个include(),Django会
截取所有匹配的文本,即这里是'weblob/',然后剩下部分是2007/,它将匹配mysite.blog.urls的第一行
2,/weblog//2007,同样第一个URL配置匹配,截取,剩下的/2007/不会和mysite.blog.urls中的任何
一行匹配
3,/about/,在第一个URL配置中和mysite.views.about匹配,这表明你可以混用include()和
非include()模式
捕获的参数怎样与inclue()工作
include的URL配置从父URL配置接受捕获的参数,例如:
代码
#
root urls.py
from
django.conf.urls.defaults
import
*
urlpatterns
=
patterns(
''
,
(r
'
^(?P<username>w+)/blog/
'
, include(
'
foo.urls.blog
'
)),
)
#
foo/urls/blog.py
from
django.conf.urls.defaults
import
*
urlpatterns
=
patterns(
''
,
(r
'
^$
'
,
'
foo.views.blog_index
'
),
(r
'
^archive/$
'
,
'
foo.views.blog_archive
'
),
)
这个例子中,被捕获的username变量传递到include的URL配置,然后传递到匹配的每个视图方法里
注意捕获的参数将一直被传递到include的URL配置的每一行,不管那一行的视图是否认为是合法的参数
由于这个原因,这项技术仅仅当你确认在include的URL配置里每个视图接受你传递的参数时才是有用的
额外URL配置选项怎样与include()工作
同样的,你可以传递额外URL配置选项到include(),就像你可以传递额外URL配置选项到普通视图一样
当你这样做的时候,include的URL配置的每一行都将接受额外选项,例如下面的两种配置是一样的:
配置1:
代码
#
urls.py
from
django.conf.urls.defaults
import
*
urlpatterns
=
patterns(
''
,
(r
'
^blog/
'
, include(
'
inner
'
), {
'
blogid
'
:
3
}),
)
#
inner.py
from
django.conf.urls.defaults
import
*
urlpatterns
=
patterns(
''
,
(r
'
^archive/$
'
,
'
mysite.views.archive
'
),
(r
'
^about/$
'
,
'
mysite.views.about
'
),
(r
'
^rss/$
'
,
'
mysite.views.rss
'
),
)
配置2:
代码
#
urls.py
from
django.conf.urls.defaults
import
*
urlpatterns
=
patterns(
''
,
(r
'
^blog/
'
, include(
'
inner
'
)),
)
#
inner.py
from
django.conf.urls.defaults
import
*
urlpatterns
=
patterns(
''
,
(r
'
^archive/$
'
,
'
mysite.views.archive
'
, {
'
blogid
'
:
3
}),
(r
'
^about/$
'
,
'
mysite.views.about
'
, {
'
blogid
'
:
3
}),
(r
'
^rss/$
'
,
'
mysite.views.rss
'
, {
'
blogid
'
:
3
}),
)
注意额外选项将一直传递给include的URL配置的每一行,而不管那一行的视图是否认为是合法的选项
由于这个原因,这项技术仅仅当你确认在include的URL配置里每个视图接受你传递的选项时才是有用的