更新Jinja2模板变量

1 投票
1 回答
3855 浏览
提问于 2025-04-18 16:12

我正在使用Python和jinja2模板的appengine。

在这个过程中,我遇到了一个问题:我用这段代码来显示一个游戏列表

self.templateValues = {}
self.templateValues['title'] = 'GalaStore'
self.templateValues['values'] = kw
gamesQuery = Game.all()
values = {'games' : gamesQuery.run()}
self.templateValues['gl'] = values
template = JINJA_ENVIRONMENT.get_template(template)        
self.response.out.write(template.render(self.templateValues))

然后在我的html中有一些按钮过滤器,每个按钮都会调用不同的js函数。问题是:当我点击“按字母排序”的过滤器,并通过js(使用ajax)调用一个Python函数“sortByAlpha”时,我该如何在运行时更新模板中的变量,而不需要再次调用template.render()函数?因为这样会导致整个页面重新加载,我想避免这种情况。

非常感谢!

1 个回答

4

你的AJAX请求需要返回一个包含游戏列表的JSON对象,这样JavaScript才能在浏览器中更新这个列表。或者,你可以有一个模板专门用来渲染页面的那一部分,然后用JavaScript把服务器加载的HTML替换掉那一块。

后者可以做到重复使用;让你的主视图和AJAX处理程序都使用同一个模板,只渲染游戏列表(而不是整个页面):

def rendered_games_list(self, sort_by=None):
    games_query = Game.all()
    if sort_by:
        # I winged this bit, you didn't specify the ORM used
        games_query = games_query.order_by(sort_by)
    template = JINJA_ENVIRONMENT.get_template(games_list_template)        
    return template.render(gl=games_query.run())

然后在你的主视图中使用这一部分:

template_values = {
    'title': 'GalaStore',
    'values': kw,
    'games_list': self.rendered_games_list()
}
template = JINJA_ENVIRONMENT.get_template(template)        
self.response.out.write(template.render(self.templateValues))

在你的主模板中插入渲染好的游戏列表HTML,如下:

{{ games_list|safe }}

所以你的主模板并不直接渲染游戏列表,它只是把它包含进来。

你的AJAX处理程序可以直接返回rendered_games_list()

sort_order = self.request.get('sort_order', None)
self.response.out.write(self.rendered_games_list(sort_order))

撰写回答