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_predicates
parâmetro do view_config
decorador.
Meu predicado personalizado é simplesmente uma função que pega o contexto e a solicitação e retorna se um url
parâmetro foi ou não passado:
def contains_url(context, request):
return bool(request.GET.get('url'))
Dados meus dois modelos, content_list.jinja2
e 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() }