在同一视图方法内切换渲染器的简便方法


问题内容

我这样设置我的功能

@view_config(
    route_name = 'route_name',
    permissions = 'permissions',
    renderer = 'r.mako'
)
def r( request ):
    # stuff goes here

现在,我想添加功能,以便检查某些条件(使用ajax),我将使用一个模板,否则将使用另一个模板。有没有办法在金字塔中做到这一点?谢谢


问题答案:

如果可以通过谓词确定要执行的操作,则可以使用不同的渲染器多次添加视图。例如

@view_config(route_name='route', xhr=True, renderer='json')
@view_config(route_name='route', renderer='r.mako')
@view_config(route_name='route', request_param='fmt=json', renderer='json')
def r(request):
    # ...

或者,您可以通过request.override_renderer = 'b.mako'以下方式手动覆盖渲染器:

http://docs.pylonsproject.org/projects/pyramid/zh-
CN/1.3-branch/narr/renderers.html#overriding-a-renderer-at-
runtime

或者,您可以仅通过视图中的renderrender_to_response方法显式呈现响应,因为renderer如果Response从视图中返回对象,则将忽略该参数。

请注意,xhr第一个示例中的谓词应足以检查ajax请求。还请注意,如果您不想这样做,则不必对两者都使用相同的视图,只需视情况而定。