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

发布于 2024-11-18 06:42:15 字数 867 浏览 3 评论 0原文

我有 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")

那么如何根据上下文的内容渲染不同的模板?

I have 3 different product page layouts that I would like to display dependent on the information available about the products. Using traversal I have a class called ProductFinder that grabs all the information. For example the user goes to domain/green/small and ProductFinder will list all products from my DB that are green and small. This list is self.products in the ProductFinder class. In my __init__.py I have added the line:

config.add_view('app.views.products', name='')

In products.py I have:

from pyramid.view import view_config
@view_config(context='app.models.ProductFinder', renderer='productpage.mako')
def products(context, request):
    return dict(page=context)

Based on what's in context.products though I'd like to render a different mako. In Pylons I would have done something like:

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

So how can I render a different template based on the contents of my context?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

如梦 2024-11-25 06:42:15

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

但是,您可以以任何您想要的方式影响将哪个渲染器用作视图查找的一部分。您可能已经知道可以对多个视图使用相同的视图处理程序,您只需帮助 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。有些人可能对 < code>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 所做的。

I will start off by saying this sort of seems like something you want to take care of in your template.

However, you can influence which renderer is used as part of the view lookup in just about any way you want to. As you might already know you can use the same view handler for multiple views, you simply need to help Pyramid figure out which one to use.

For example:

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. Some people might be more interested in the render_to_response approach here because then they will not be relying on custom_predicates. But it is of course up to you!

@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

This works because Pyramid will ignore the renderers if your view returns a Response() which is exactly what render_to_response does.

浅忆 2024-11-25 06:42:15

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

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

I'm not sure if it's the good way to go, but you could probably use request.override_renderer = 'oneproduct.mako'.

If it is just a different way of displaying your products depending on the quantity, you should do the decision in the template.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文