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

jch*_*ysk 7 python traversal mako pyramid

我有3种不同的产品页面布局,我想根据有关产品的可用信息显示.使用遍历我有一个叫做ProductFinder抓取所有信息的类.例如,用户转到domain/green/small,ProductFinder将列出我的数据库中绿色和小的所有产品.此列表是类中的self.products ProductFinder.在我的__init__.py我添加了行:

config.add_view('app.views.products', name='')
Run Code Online (Sandbox Code Playgroud)

在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)
Run Code Online (Sandbox Code Playgroud)

基于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")
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*kel 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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为如果您的视图返回的确Response()是什么render_to_response,Pyramid会忽略渲染器.


Ant*_*air 6

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

如果只是根据数量显示产品的不同方式,则应在模板中做出决定。