【问题标题】:Update Jinja2 template variables更新 Jinja2 模板变量
【发布时间】:2014-08-06 09:56:02
【问题描述】:

我正在使用带有 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()函数?这将导致整个页面的重新加载,我想避免它。 非常感谢!

【问题讨论】:

    标签: python google-app-engine templates variables jinja2


    【解决方案1】:

    您的 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))
    

    【讨论】:

    • 谢谢!!但我有一个疑问:使用 template.render 页面会再次加载...还是我误解了?
    • @user2961930:您将呈现页面的那部分。就是这样。
    • 它似乎不起作用......它不会呈现模板的那部分,它只是将它打印在响应选项卡上(在谷歌浏览器分析页面中)..
    • @user2961930:您确实需要在客户端编写 javascript 代码以将该 HTML 块插入页面; jQuery 有一个 .load() method 或许可以提供帮助。为什么它在你的情况下不起作用是不可能从我的立场来判断的。也许您需要就该问题发布一个新问题?
    • 完成,非常感谢 :) 如果你愿意,你可以帮我解决另一个问题,简单一点 xD
    猜你喜欢
    • 2016-05-23
    • 2019-11-01
    • 2016-10-30
    • 1970-01-01
    • 2014-06-27
    • 2012-09-14
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多