Seleção dinâmica de modelos na pirâmide

Se você normalmente usa o decorador view_config para especificar seu modelo de renderização para que possa retornar um dicionário de sua visualização, pode não ser óbvio como você pode definir dinamicamente o modelo, por exemplo, com base nas informações do objeto de solicitação.

Eu tenho uma visão definida para a rota ‘/ conteúdo’ que pode retornar uma lista de conteúdo disponível ou, dado um URL específico, retornar os detalhes do conteúdo associado a esse URL. Tornar o URL parte do padrão de URL de rota não funcionaria bem, então estou passando-o como um parâmetro de consulta.

A questão então é: como renderizo a resposta da visualização com base na solicitação ou não de um URL específico. A resposta está no custom_predicatesparâmetro do view_configdecorador.

Meu predicado personalizado é simplesmente uma função que pega o contexto e a solicitação e retorna se um urlparâmetro foi ou não passado:

def contains_url(context, request):
return bool(request.GET.get('url'))

Dados meus dois modelos, content_list.jinja2e content_detail.jinja2, eu organizei minha visualização assim:

@view_config(route_name='content',
renderer
='templates/content_detail.jinja2',
custom_predicates
=(contains_url,))
@view_config(route_name='content', renderer='templates/content_list.jinja2')
def content(request):
if request.GET.get('url'):
return lookup_content(request.GET['url'])
else:
return { 'content_list': list_content() }