我是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'的过滤器
我究竟做错了什么? (如果我排除过滤器,模板呈现正常)
你注册过滤器了吗?
environment.filters['my_multiplier'] = my_multiplier
http://jinja.pocoo.org/docs/api/#custom-filters
希望这可以帮助!
添加一些信息,因为我在搜索类似的问题时发现了这一点。
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
类 - 完整的代码在这里会更有帮助。
编辑:几个月后回顾这一点,这可能更像是一个黑客而不是一个解决方案。但是,如果你对黑客没什么好的话。
对于我使用2.7.2版本,记录的方式不起作用:
environment.filters['my_multiplier'] = my_multiplier # didn't work
这可能适用于旧版本。
相反,我通过查看代码找到了这种方式:
from jinja2 import environment
environment.DEFAULT_FILTERS['name'] = filter_function
如果有人有文档链接,请随意添加。
出于某种原因,如果您使用除了定义Flask
应用程序之外的任何其他模块的装饰器,它将不起作用。将奇怪的事情提升到一个新的水平,它适用于behave
测试,但不适用于浏览器。对于上下文处理器而言,这似乎也是如此,而不仅仅是过滤器。
看看装饰器代码,但情况并非如此。