May 29

[原]Python 框架TurboGears 2 入门文档《Wiki Tutorial》翻译校正 雨

linuxing , 16:00 , 编程 » Python , 评论(1) , 引用(0) , 阅读(141378) , Via 本站原创 | |


四、数据模型
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

※ 注意:这同样应该在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.

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

XHTML 内容:


添加控制器到root.py中:


点击page页面中的"Edit this page"链接,可打开编辑页面:
点击在新窗口中浏览此图片

5. 保存动作
编译完成后,根据上面的页面定义,会提交到/save 动作,所以,还需要添加一个负责该动作的方法:


这里无需显示视图,因此@expose()方法内容为空。当SQLAlchemy 发现由page.data = data
使得数据模型中的内容改变,TurboGears2 会自动提交事务更新。最后也没有推送的内容,直接redirect() 到新的页面即可。
内文分页: [1] [2] [3]
Tags: ,
hain
2014/05/22 18:10
楼主,我也在看turbogears 2。但还是觉得没法用来做网站,咋搞?
linuxing 回复于 2014/05/23 16:41
不想麻烦,还是用Django 吧。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]