9

製品に関して入手可能な情報に応じて表示したい3つの異なる製品ページレイアウトがあります。トラバーサルを使用して、ProductFinderすべての情報を取得するというクラスがあります。たとえば、ユーザーはdomain / green / smallに移動ProductFinderし、私のDBから緑色で小さいすべての製品を一覧表示します。このリストは、クラス内のself.productsProductFinderです。私の__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の内容に基づいています。パイロンでは、私は次のようなことをしたでしょう:

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

では、コンテキストの内容に基づいて別のテンプレートをレンダリングするにはどうすればよいですか?

4

2 に答える 2

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機能します。

于 2011-07-02T14:56:24.807 に答える
6

それが良い方法かどうかはわかりませんが、おそらく使用できますrequest.override_renderer = 'oneproduct.mako'

数量によって商品の表示方法が異なる場合は、テンプレートで決定する必要があります。

于 2011-07-02T12:26:33.023 に答える