在金字塔中,如何根据上下文内容使用其他渲染器?


问题内容

我希望根据有关产品的可用信息显示3种不同的产品页面布局。使用遍历,我有一个名为的类ProductFinder,可以获取所有信息。例如,用户转到domain
/ green / small,ProductFinder并将列出来自我的数据库的所有绿色和小型产品。此列表是该类中的self.products
ProductFinder。在我中,__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。在塔架中,我会做类似的事情:

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

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


问题答案:

首先,我要说的是您想在模板中处理的这种事情。

但是
,您几乎可以通过任何方式影响将哪个渲染器用作视图查找的一部分。您可能已经知道可以将相同的视图处理程序用于多个视图,您只需要帮助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)

注意
有些人可能对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()render_to_response可行的,因为如果您的视图返回的a恰恰是金字塔的意思,那么Pyramid将忽略渲染器。