更新Jinja2模板变量

时间:2014-08-06 09:56:03

标签: python google-app-engine templates variables 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函数。问题是:一旦我点击过滤器“按alpha排序”并通过js(通过ajax)调用python函数“sortByAlpha”,如何在运行时更新模板变量而不再调用template.render()函数?这将导致重新加载整个页面,我想避免它。 非常感谢你!

1 个答案:

答案 0 :(得分:3)

您的AJAX请求需要以JSON格式返回games对象列表,因此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))