我想要显示3种不同的产品页面布局,具体取决于有关产品的可用信息。使用遍历我有一个名为ProductFinder
的类,可以获取所有信息。例如,用户转到domain / green / small,ProductFinder
将列出我的数据库中绿色和小的所有产品。此列表是ProductFinder
类中的self.products。在我的__init__.py
我添加了一行:
config.add_view('app.views.products', name='')
在products.py中我有:
from pyramid.view import view_config
@view_config(context='app.models.ProductFinder', renderer='productpage.mako')
def products(context, request):
return dict(page=context)
基于context.products中的内容,虽然我想渲染一个不同的mako。在Pylons中,我会做类似的事情:
def products(context, request):
if len(context.products) == 1:
return render("oneproduct.mako")
elif len(context.product) == 2:
return render("twoproducts.mako")
那么如何根据我的上下文内容呈现不同的模板呢?
答案 0 :(得分:11)
我首先要说的是,这类似乎是你想在模板中处理的事情。
但是,您可以以任何您想要的方式影响哪个渲染器用作视图查找的一部分。您可能已经知道,您可以为多个视图使用相同的视图处理程序,您只需要帮助Pyramid找出要使用的视图。
例如:
from pyramid.view import view_config
def ProductLengthPredicate(length):
def check_length(context, request):
return len(context.products) == length
return check_length
@view_config(context='app.models.ProductFinder', renderer='oneproduct.mako',
custom_predicates=(ProductLengthPredicate(1),))
@view_config(context='app.models.ProductFinder', renderer='twoproducts.mako',
custom_predicates=(ProductLengthPredicate(2),))
@view_config(context='app.models.ProductFinder', renderer='manyproducts.mako')
def products(context, request):
return dict(page=context)
NB。有些人可能对render_to_response
方法更感兴趣,因为他们不会依赖custom_predicates
。但这当然取决于你!
@view_config(context='app.models.ProductFinder', renderer='manyproducts.mako')
def products(context, request)
opts = dict(page=context)
if len(context.products) == 1:
return render_to_response('oneproduct.mako', opts, request)
if len(context.products) == 2:
return render_to_response('twoproducts.mako', opts, request)
return opts
这是有效的,因为如果您的视图返回Response()
,那么Pyramid会忽略渲染器,这正是render_to_response
所做的。
答案 1 :(得分:4)
我不确定这是不是一个好方法,但你可以使用request.override_renderer = 'oneproduct.mako'
。
如果只是根据数量显示产品的另一种方式,您应该在模板中做出决定。