May
29
[原]Python 框架TurboGears 2 入门文档《Wiki Tutorial》翻译校正
四、数据模型
1. 初始化表结构
模型定义在Wiki-20/wiki20/model/ 目录,该目录包含一个__init__.py 文件,其中定义了数据库中表的结构。这里要增加一个page 表,可通过编写Wiki-20/wiki20/model/page.py 文件增加一个Page 类实现。简单的办法是,由model.template 拷贝得到模板:
# cp model.template page.py
然后内容修改为:
然后,在Wiki-20/wiki20/model/__init__.py 中加入新的Page 类:
※ 注意:原文中这里写错from wiki20.model.wiki,应该是from wiki20.model.page。
TurboGears2可以为每个模板自动创建表结构,这是由websetup 模块实现的。
以创建首个FrontPage 页面为例,修改websetup/boostrap.py 文件,加入下面的内容到DBSession.flush() 的前面(建议放在try:except 流程里面):
其中,transaction.commit() 会执行数据库事务提交。这样,我们就可以通过paster setup-app 根据上述数据库模型内容,创建表结构和内容:
引用
(tg22env)[root@iscsi-server Wiki-20]# paster setup-app development.ini
Running setup_app() from wiki20.websetup
Creating tables
Running setup_app() from wiki20.websetup
Creating tables
※ 注意:这同样应该在Wiki-20 根目录下运行,而非model 目录。
根据development.ini 中的sqlalchemy.url 配置,TurboGears2 默认使用SQLite3 数据库。其位置在Wiki-20目录下,文件名为:devdata.db。
为了验证后续对数据库的修改操作,我们可以用系统的sqlite3 客户端打开该数据库文件进行查询。例如:
引用
# sqlite3 devdata.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
migrate_version tg_group_permission tg_user_group
page tg_permission
tg_group tg_user
sqlite> .schema page
CREATE TABLE page (
id INTEGER NOT NULL,
pagename TEXT,
data TEXT,
PRIMARY KEY (id),
UNIQUE (pagename)
);
sqlite> select * from page;
1|FrontPage|initial data.
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
migrate_version tg_group_permission tg_user_group
page tg_permission
tg_group tg_user
sqlite> .schema page
CREATE TABLE page (
id INTEGER NOT NULL,
pagename TEXT,
data TEXT,
PRIMARY KEY (id),
UNIQUE (pagename)
);
sqlite> select * from page;
1|FrontPage|initial data.
2. 增加控制器
要把数据模型内容显示出现,需要通过控制器作为中间者。因此,首要做的是定义对应的控制器,假设以URL 根为相对路径,可以修改Wiki-20/wiki20/controllers/root.py,先导入使用的数据模型类:
然后创建对应的操作动作方法:
其中,@expose 定义对应的模板视图;
def page(self, pagename="FrontPage") 是动作函数(与原文不同的是,我这里没有修改index 部分,而是新增加一个page 动作),而pagename 可以从URL 中通过GET或POST 方法获取,这里赋予默认值;
DBSession.query(Page) 对Page 表模型执行查询操作,后面的filter_by()是查询条件,.one() 表示仅返回一条数据即可;
return dict(wikipage=page) 将把查询结果page 变量赋值给wikipage 变量,并交由dict() 转成字典数据,推送到视图模板。
3. 增加视图模板
为了对应@expose('wiki20.templates.page') 指定的视图模板,需要创建一个新的page.html 页面。可以拷贝现有index.html 文件:
# cp index.html page.html
修改内容为:
可见,变量都由{} 括起来,例如${wikipage.pagename}指控制器推送的$wikipage变量中的pagename变量内容(字典键)。而py:replace 标签,表示将会用推送的内容替换当前位置(span标签)中的内容。py:replace 会替换整个标签,包括开始和结束部分,如果仅是安放变量内容,可以使用py:content(见后面介绍)。
以上显示页面已完成,可通过http://ip:8080/page/ 或 http://ip:8080/page/FrontPage 查看(FrontPage 将作为pagename参数输入page()方法中,默认值也是它,所以可以忽略)。
4. 编辑页面
接着要实现的是编辑页面,类似的创建视图模板:
# cd wiki20/templates
# cp page.html edit.html
# cp page.html edit.html
XHTML 内容:
添加控制器到root.py中:
点击page页面中的"Edit this page"链接,可打开编辑页面:
5. 保存动作
编译完成后,根据上面的页面定义,会提交到/save 动作,所以,还需要添加一个负责该动作的方法:
这里无需显示视图,因此@expose()方法内容为空。当SQLAlchemy 发现由page.data = data
使得数据模型中的内容改变,TurboGears2 会自动提交事务更新。最后也没有推送的内容,直接redirect() 到新的页面即可。
hain
2014/05/22 18:10
楼主,我也在看turbogears 2。但还是觉得没法用来做网站,咋搞?
linuxing 回复于 2014/05/23 16:41
不想麻烦,还是用Django 吧。
分页: 1/1
1

