在同一视图方法中轻松切换渲染器的方法

3 投票
1 回答
1842 浏览
提问于 2025-04-17 08:41

我把我的函数设置成这样

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

现在,我想增加一个功能,就是根据某些条件(用ajax)来决定使用一个模板,如果条件不满足,就用另一个模板。请问在pyramid里有办法做到这一点吗?谢谢!

1 个回答

16

你可以根据条件来决定要怎么处理视图,这样就可以用不同的渲染器多次添加同一个视图。比如说:

@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/en/1.3-branch/narr/renderers.html#overriding-a-renderer-at-runtime

另外,你也可以直接在视图中使用 renderrender_to_response 方法来明确渲染响应,因为如果你从视图返回一个 Response 对象,renderer 参数就会被忽略。

需要注意的是,第一个例子中的 xhr 条件足以用来检查是否是 ajax 请求。还有,如果你不想的话,也不一定要对两个请求使用同一个视图,这完全看你的需求。

撰写回答