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

use*_*829 2 python jinja2 flask

我是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
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:TemplateAssertionError:没有名为“ my_multiplier”的过滤器

我究竟做错了什么?(如果我排除过滤器,则模板可以很好地呈现)

And*_*oos 5

您是否注册了过滤器?

environment.filters['my_multiplier'] = my_multiplier
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!


oot*_*wch 5

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

来自http://flask.pocoo.org/docs/0.10/templating/ 的当前答案:

注册过滤器

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

以下两个示例工作相同,并且都反转对象:

@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]
Run Code Online (Sandbox Code Playgroud)
def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
Run Code Online (Sandbox Code Playgroud)

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

{% for x in mylist | reverse %}{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

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