如何在Flask / Jinja模板中使用不同于过滤器的管道?

时间:2016-01-14 14:47:00

标签: python templates flask jinja2 peewee

我正在Flask使用Jinja2 templating engine来构建网站。作为一个ORM,我使用(优秀的)Peewee ORM,现在我遇到了一个问题。

在我的Flask视图中,我从DB获得了一个用户列表:

@app.route('/stats')
def stats():
    users = User.select()
    return render_template('stats.html', users=users)

在我的模板中,我遍历用户并尝试扩展查询。这有效:

{% for user in users %}
    {{ user.app_logs.where(AppLog.type == 'LOGIN').first().created }}
{% endfor %}

但是这个:

{% for user in users %}
    {{ user.app_logs.where((AppLog.type == 'LOGIN') | (AppLog.type == AppLog.TICKET)).first().created }}
{% endfor %}

给出TemplateSyntaxError: expected token 'name', got '('。我理解错误的来源:管道符号(|)定义为a filter in Jinja。所以我尝试使用反斜杠(\|)来逃避它,但这不起作用。

所以我的问题是:有没有办法以某种方式逃脱管道符号或者是否有人有任何其他想法使这项工作?欢迎所有提示!

1 个答案:

答案 0 :(得分:2)

无论如何,保持模板“愚蠢”是一种更好的做法。并在模板之外进行查询。在您的情况下,您可以使用playhouse extension to use hybrid attributes on the model

class User(Model):
    ...

    @hybrid_property
    def applog_login_ticket(self):
        return self.app_logs.where((AppLog.type == 'LOGIN') | (AppLog.type == AppLog.TICKET)).first().created()

然后在你的模板中你可以做到

{% for user in users %}
    {{ user.applog_login_ticket }}
{% endfor %}