在Pyramid和Jinja 2模板中公开全局数据和函数

时间:2013-10-24 22:42:52

标签: python pyramid jinja2

我有一个用户登录时的基本模板,在该基本模板上,我需要在下拉菜单中添加特定于用户的选项。带有选项的下拉菜单必须在所有处理程序中保持不变,即,任何时候使用子模板调用(扩展)基本模板。

除了执行必要的数据库查询,将查询结果分配给变量,并将该变量传递给每个处理程序(有很多),如何将其合并为一个查询和一个变量,直接传递给基础模板?我也在使用jinja2模板。

我讨厌做一些如此繁琐的事情以换取更简单和可维护的东西。

有什么想法吗?感谢。


编辑

所以我仍然没有找到任何完全我正在寻找的东西;但是,我决定至少在此期间取得一些进展。所以,我做了一个自定义装饰器,它接受一个视图返回的dict()并将适当的数据附加到它。例如:

def get_base_data(func):
    def wrapper(request):
        d = func(request)
        user_id = request.user.id  # used in query
        contact_group_data = ContactGroups.query.filter(...criteria...).all()
        d['contact_group_data'] = contact_group_data
        return d
    return wrapper

现在,我至少可以通过简单地简单地装饰每个方法:

@view_config(...)
@get_base_data
def my_handler(request):
    pass  # rest of code...

1 个答案:

答案 0 :(得分:6)

这是金字塔中最明显的事情之一,并且花了一段时间才找到我。

您可以在BeforeRender事件中修改全局模板上下文。

http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#using-the-before-render-event

或者,您可以使用基于类的视图,从一个具有get_base_data()的基本视图类继承所有视图,然后将类实例传递给模板上下文到您的所有视图,然后您可以提取数据与{{ view.get_base_data }}

http://ruslanspivak.com/2012/03/02/class-based-views-in-pyramid/

我保证采用后一种方法,因为它更美观,更可预测,更易于维护工程。