|
product.kid 模板有一个产品信息表。此处要注意用来显示价格(有两位小数)的 Python 字符串的格式:
清单 15. 分类页 kid 模板文件(product.kid)
<table id="product-info">
<tr>
<td class="fld">Name:</td>
<td class="val"><span py:replace="product.name" /></td>
</tr>
<tr>
<td class="fld">SKU:</td>
<td class="val"><span py:replace="product.sku" /></td>
</tr>
<tr>
<td class="fld">Price:</td>
<td class="val">$<span py:replace="'%.2f' % product.price" /></td>
</tr>
</table>
图 3 给出了产品显示页面:
图 3. 产品显示页面
错误处理
控制器方法尚未考虑的一件事是 SQLObject 的 get 方法所抛出的 SQLObjectNotFound 异常。清单 16 给出了捕获这个异常并将其作为 NotFound 异常重新抛出的方法,这会发送一个基本的 HTTP 404 错误:
清单 16. 向 Controller 类添加的错误处理
from model import Category, Product
from sqlobject import SQLObjectNotFound
from cherrypy import NotFound
from turbogears import controllers, expose, url
class Root(controllers.Root):
@expose("tgcommerce.templates.category")
def category(self, categoryID):
try:
category = Category.get(categoryID)
except SQLObjectNotFound:
raise NotFound()
return dict(category=category)
@expose("tgcommerce.templates.product")
def product(self, productID):
try:
product = Product.get(productID)
except SQLObjectNotFound:
raise NotFound()
return dict(product=product)
处理找不到对象的错误的另外一个策略不是发送 404 错误,而是对其进行重定向。这是使用 turbogears.redirect(...) 方法实现的:
清单 17. 重定向的例子
from turbogears import redirect
try:
object = ClassName.get(objectID)
except SQLObjectNotFound:
raise redirect("/path_to_redirect")
购物车
为了有一个可以正常工作的购物车,我们需要启用会话来维护请求之间的状态。会话是在配置文件中通过将 session_filter.on 值设置为 True 来启用的。
上一篇:给程序加个图标
下一篇:多继承详解
|