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