1. 现在来看看第一个页面吧

代码已经准备好...打开浏览器,输入http://localhost:8080/来看看结果怎么样? FT,得到一个错误。因为我们是在开发模式下面,Cherrypy显示出了所有的错误历史.我们可以看到因为一个SQLObjectNotFound异常导致这个错误. 原因很简单,我们还没有往数据库里面存放任何页面,系统当然抛出SQLObjectNotFound异常.现在来亡羊补牢,往数据库里添加数据: 我们用Turbogears特制的Python Shell来做这件事:

tg-admin shell
Page(pagename="FrontPage", data="Welcome to my front page")

注意,因为tg-admin已经为我们安排好一切,我们不需要import任何东西 那一行代码就已经为我们在数据库里面创建了一个页面了。 重新载入页面,这次你会看到一个漂亮的页面了:-) 如果创建一个更好的页面? Wiki的一个特点是你可以直接通过点击"编辑"按钮来编辑页面.希望那些wikispamers没有发现你的小wiki,哈哈 让我们从创建一个编辑页面模板开始,首先拷贝一个"page.kid"

cd wiki20/templates
 cp page.kid edit.kid
 cd ../..

在edit.kid里面,我们需要把顶端的"Viewing"改成"Editing",另外修改用来显示数据的<div>为:

<form action="save" method="post">
   <input type="hidden" name="pagename" py:attrs="value=pagename"/>
   <textarea name="data" py:content="data" rows="10" cols="60"/>
   <input type="submit" name="submit" value="Save"/>
</form>

现在我们来添加一个Edit方法在我们的Controller里面来使用这个模板:

@turbogears.expose(html="wiki20.templates.edit")
def edit(self, pagename):
 page = Page.byPagename(pagename)
   return dict(pagename=page.pagename, data=page.data) 

这个方法和我们的index方法十分类似,2者主要的区别在于index方法把我们的wiki格式化为HTML页面而edit则直接返回文本. 我们需要一个链接来连到我们的edit方法,最直接的就是在page.kid模板最下面中加上这么一句话:

  <p><a href="${std.url('/edit', _fcksavedurl=""${std.url('/edit'," pagename=pagename)}">Edit this page</a></p> 

这样就应该ok了!在浏览器里面重新载入页面,你讲看到一个edit链接.点击这个链接,你会进入一个可以编辑的页面,不要点击save 按钮!我们还没有写相关的代码 保存编辑数据 因为在上一节我们做的表单中有一个"save"动作,所以我们我们需要在我们的controller中创建一个叫save的方法.如下面所示:

@turbogears.expose()
def save(self, pagename, data, submit):
 hub.begin()
 page = Page.byPagename(pagename)
 page.data = data
 hub.commit()
 hub.end()
 turbogears.flash("Changes saved!")
 raise cherrypy.HTTPRedirect(turbogears.url("/", pagename=pagename)) 

因为表单会提交所有的变量,所以我们添加了submit参数.如果我们不这么做,python就会抱怨说有一个计划外参数. 另外一种避免这个抱怨的方式是用**keywords变量,同时我们需要import cherrypy来进行页面重定向.

import cherrypy

在这段代码中一些值得注意的:

  • 1.不像前面我们编写的方法,这个save方法没有expose任何模板.这是因为在这个方法中我们最后会重定向到其他页面 2.hub.begin()开始一个事务.就目前这个wiki来说我们根本不需要事务,但是用事务是个好习惯 3."page.data=data"会幕后处理一切与更新数据相关的工作 4.turbogears.flash()会在页面上显示一个消息,你在master.kid模板里看到一个tg_flash变量 5.由于HTTPRedirect是一个异常,HTTPRedirect下面所有的代码都不会执行,非常方便!

搞定!现在我们来试一试,你可以对页面进行编辑然后保存,很像一个wiki了,对不? 现在来看看第一个页面吧 代码已经准备好...打开浏览器,输入http://localhost:8080/

来看看结果怎么样? FT,得到一个错误。因为我们是在开发模式下面,Cherrypy显示出了所有的错误历史.我们可以看到因为一个SQLObjectNotFound异常导致这个错误. 原因很简单,我们还没有往数据库里面存放任何页面,系统当然抛出SQLObjectNotFound异常.现在来亡羊补牢,往数据库里添加数据: 我们用Turbogears特制的Python Shell来做这件事:

tg-admin shell
Page(pagename="FrontPage", data="Welcome to my front page")

注意,因为tg-admin已经为我们安排好一切,我们不需要import任何东西 那一行代码就已经为我们在数据库里面创建了一个页面了。 重新载入页面,这次你会看到一个漂亮的页面了:-) 如果创建一个更好的页面? Wiki的一个特点是你可以直接通过点击"编辑"按钮来编辑页面.希望那些wikispamers没有发现你的小wiki,哈哈 让我们从创建一个编辑页面模板开始,首先拷贝一个"page.kid"

cd wiki20/templates
 cp page.kid edit.kid
 cd ../..

在edit.kid里面,我们需要把顶端的"Viewing"改成"Editing",另外修改用来显示数据的<div>为:

<form action="save" method="post">
   <input type="hidden" name="pagename" py:attrs="value=pagename"/>
   <textarea name="data" py:content="data" rows="10" cols="60"/>
   <input type="submit" name="submit" value="Save"/>
</form>

现在我们来添加一个Edit方法在我们的Controller里面来使用这个模板:

@turbogears.expose(html="wiki20.templates.edit")
def edit(self, pagename):
 page = Page.byPagename(pagename)
   return dict(pagename=page.pagename, data=page.data) 

这个方法和我们的index方法十分类似,2者主要的区别在于index方法把我们的wiki格式化为HTML页面而edit则直接返回文本. 我们需要一个链接来连到我们的edit方法,最直接的就是在page.kid模板最下面中加上这么一句话:

  <p><a href="${std.url('/edit', _fcksavedurl=""${std.url('/edit'," pagename=pagename)}">Edit this page</a></p> 

这样就应该ok了!在浏览器里面重新载入页面,你讲看到一个edit链接.点击这个链接,你会进入一个可以编辑的页面,不要点击save 按钮!我们还没有写相关的代码 保存编辑数据 因为在上一节我们做的表单中有一个"save"动作,所以我们我们需要在我们的controller中创建一个叫save的方法.如下面所示:

@turbogears.expose()
def save(self, pagename, data, submit):
 hub.begin()
 page = Page.byPagename(pagename)
 page.data = data
 hub.commit()
 hub.end()
 turbogears.flash("Changes saved!")
 raise cherrypy.HTTPRedirect(turbogears.url("/", pagename=pagename)) 

因为表单会提交所有的变量,所以我们添加了submit参数.如果我们不这么做,python就会抱怨说有一个计划外参数. 另外一种避免这个抱怨的方式是用**keywords变量,同时我们需要import cherrypy来进行页面重定向. 在这段代码中一些值得注意的: 1.不像前面我们编写的方法,这个save方法没有expose任何模板.这是因为在这个方法中我们最后会重定向到其他页面 2.hub.begin()开始一个事务.就目前这个wiki来说我们根本不需要事务,但是用事务是个好习惯 3."page.data=data"会幕后处理一切与更新数据相关的工作 4.turbogears.flash()会在页面上显示一个消息,你在master.kid模板里看到一个tg_flash变量 5.由于HTTPRedirect是一个异常,HTTPRedirect下面所有的代码都不会执行,非常方便! 搞定!现在我们来试一试,你可以对页面进行编辑然后保存,很像一个wiki了,对不?