I will start by saying that this is similar to what you want to take care of in your template.
However, you can influence which renderer is used as part of the view view almost the way you want. As you already know, you can use the same view handler for several views, you just need to help Pyramid figure out which one to use.
For instance:
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 may be more interested in render_to_response because then they will not rely on custom_predicates . But that, of course, is 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 renderers if your view returns Response() , which is what render_to_response does.
source share