Я начну с того, что в вашем шаблоне вы хотите позаботиться о таком виде.
Однако, , вы можете влиять на то, какой рендерер используется как часть просмотра представления практически любым способом, каким вы хотите. Как вы уже знаете, вы можете использовать один и тот же обработчик представления для нескольких представлений, вам просто нужно помочь 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
Это работает, потому что Pyramid будет игнорировать средства визуализации, если ваше представление возвращает Response()
, что именно то, что render_to_response
делает.