Python 在金字塔中,如何根据上下文内容使用不同的渲染器?

Python 在金字塔中,如何根据上下文内容使用不同的渲染器?,python,pyramid,traversal,mako,Python,Pyramid,Traversal,Mako,我有3个不同的产品页面布局,我想显示的产品相关的可用信息的依赖。使用遍历,我有一个名为ProductFinder的类,它获取所有信息。例如,用户进入domain/green/small,并且ProductFinder将列出my DB中所有绿色和小型的产品。此列表是ProductFinder类中的self.products。在我的\uuuu init\uuuuu.py中,我添加了一行: config.add_view('app.views.products', name='') 在product

我有3个不同的产品页面布局,我想显示的产品相关的可用信息的依赖。使用遍历,我有一个名为
ProductFinder
的类,它获取所有信息。例如,用户进入domain/green/small,并且
ProductFinder
将列出my DB中所有绿色和小型的产品。此列表是
ProductFinder
类中的self.products。在我的
\uuuu init\uuuuu.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。在塔架中,我会做一些类似的事情:

def products(context, request):
    if len(context.products) == 1:
        return render("oneproduct.mako")
    elif len(context.product) == 2:
        return render("twoproducts.mako")

那么,如何根据上下文的内容呈现不同的模板呢?

我不确定这是否是一个好方法,但您可能可以使用
request.override\u renderer='oneproduct.mako'


如果这只是一种根据数量显示产品的不同方式,那么您应该在模板中做出决定。

我首先要说的是,这种方式似乎是您希望在模板中注意的

但是,您可以通过任何方式影响将哪个渲染器用作视图查找的一部分。您可能已经知道,可以对多个视图使用同一个视图处理程序,只需帮助Pyramid确定使用哪一个即可

例如:

从pyramid.view导入视图\u配置
def ProductLengthPredicate(长度):
def检查长度(上下文、请求):
返回len(context.products)=长度
返回检查长度
@查看配置(context='app.models.ProductFinder',renderer='oneproduct.mako',
自定义_谓词=(ProductLengthPredicate(1),)
@查看配置(context='app.models.ProductFinder',renderer='twoproducts.mako',
自定义_谓词=(ProductLengthPredicate(2),)
@查看配置(context='app.models.ProductFinder',renderer='manyproducts.mako')
def产品(上下文、请求):
返回dict(页面=上下文)
注意。有些人可能对这里的方法更感兴趣,因为这样他们就不会依赖于。但这当然取决于你

@view\u config(context='app.models.ProductFinder',renderer='manyproducts.mako')
def产品(上下文、请求)
opts=dict(页面=上下文)
如果len(context.products)==1:
返回render\u to\u响应('oneproduct.mako',opts,request)
如果len(context.products)==2:
返回render\u to\u响应('twoproducts.mako',opts,request)
返回选项

这是因为如果您的视图返回一个
Response()
,而这正是
render\u to\u Response
所做的,金字塔将忽略渲染器。

您在那里的第一行“config.add\u view('app.views.products',name=''”很可能不是您想要的。@view\u配置是我认为您真正关心的唯一配置。非常感谢。自定义谓词正是我想要的简单解决方案!