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
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就会自动生成相应的表
' 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然后输入下面的代码试试:
代码
>>> 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配置模块,例如:
代码
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:
代码
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配置接受捕获的参数,例如:
代码
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:
代码
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:
代码
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配置里每个视图接受你传递的选项时才是有用的