如何在Flask中为动态生成的jinja2模板注册过滤器?

问题描述 投票:1回答:4

我是Flask的新手。我试图动态生成我的模板,以便我可以通过AJAX发出请求并将行追加到表中:

@app.template_filter('my_multiplier')
def my_multiplier(n):
  return n*10

@app.route('/')
def index():
  content = [1,2,3,4,5]
  tmplate = get_template()
  html = tmplate.render(content=content)
  return render_template('index.jinja2',html=html)


def get_template():
  html = Template(u'''\
    {% for n in conent %}
    <tr><td>{{ n | my_multiplier }}</td></tr>   
    {% endfor %}''')
  return html

我收到一个错误:TemplateAssertionError:没有名为'my_multiplier'的过滤器

我究竟做错了什么? (如果我排除过滤器,模板呈现正常)

python flask jinja2
4个回答
5
投票

你注册过滤器了吗?

environment.filters['my_multiplier'] = my_multiplier

http://jinja.pocoo.org/docs/api/#custom-filters

希望这可以帮助!


3
投票

添加一些信息,因为我在搜索类似的问题时发现了这一点。

http://flask.pocoo.org/docs/0.10/templating/目前的回答:

注册过滤器

如果您想在Jinja2中注册自己的过滤器,您有两种方法可以做到这一点。您可以手动将它们放入应用程序的jinja_env中,也可以使用template_filter()装饰器。

以下两个示例的工作方式相同,都反转了一个对象:

@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter

在装饰器的情况下,如果要将函数名称用作过滤器的名称,则参数是可选的。注册后,您可以像使用Jinja2的内置过滤器一样在模板中使用过滤器,例如,如果您在应用程序上下文中有一个名为mylist的Python列表:

{% for x in mylist | reverse %}{% endfor %}

对于上面的例子,这意味着llamawithabowlcut是正确的,OP的代码应该如图所示。

我试图重建所描述的用例,但我不确定OP从哪里得到Template类 - 完整的代码在这里会更有帮助。


1
投票

编辑:几个月后回顾这一点,这可能更像是一个黑客而不是一个解决方案。但是,如果你对黑客没什么好的话。

对于我使用2.7.2版本,记录的方式不起作用:

environment.filters['my_multiplier'] = my_multiplier  # didn't work

这可能适用于旧版本。

相反,我通过查看代码找到了这种方式:

from jinja2 import environment
environment.DEFAULT_FILTERS['name'] = filter_function

如果有人有文档链接,请随意添加。


0
投票

出于某种原因,如果您使用除了定义Flask应用程序之外的任何其他模块的装饰器,它将不起作用。将奇怪的事情提升到一个新的水平,它适用于behave测试,但不适用于浏览器。对于上下文处理器而言,这似乎也是如此,而不仅仅是过滤器。

看看装饰器代码,但情况并非如此。

© www.soinside.com 2019 - 2024. All rights reserved.