更新Jinja2模板变量
我正在使用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))