2014-02-12 60 views
1

我是Flask的新手。我試圖動態生成我的模板,這樣我可以通過AJAX請求,並追加行到表:如何在Flask中爲動態生成的jinja2模板註冊過濾器?

@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」

什麼時我做錯了? (如果我排除過濾器,則模板呈現良好)

回答

4

您是否註冊過濾器?

environment.filters['my_multiplier'] = my_multiplier 

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

希望這有助於!

+0

如果我沒有弄錯,@ app.template_filter('my_multiplier')註冊過濾器,不是嗎? –

1

添加一些信息,因爲我發現這一點,而谷歌搜索類似的問題。從http://flask.pocoo.org/docs/0.10/templating/

當前回答:

Registering Filters

If you want to register your own filters in Jinja2 you have two ways to do that. You can either put them by hand into the jinja_env of the application or use the template_filter() decorator.

The two following examples work the same and both reverse an object:

@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 

In case of the decorator the argument is optional if you want to use the function name as name of the filter. Once registered, you can use the filter in your templates in the same way as Jinja2’s builtin filters, for example if you have a Python list in context called mylist:

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

對於上面的例子這將意味着,llamawithabowlcut是正確的,如圖所示,OP的代碼應工作。

我試圖重建所描述的用例,但我不知道在哪裏的OP從拿到Template類 - 完整的代碼將有更多的幫助在這裏。

0

由於某種原因,如果您使用的是除定義Flask應用程序之外的其他任何模塊的裝飾器,則不起作用。把怪異帶到下一個級別,它在behave測試中工作,但不在瀏覽器中。情境處理器似乎也是如此,而不僅僅是過濾器。

看着裝飾者代碼,這應該不是這樣的。

1

編輯:幾個月後回顧一下,這可能更多的是一種解決方案。它的工作原理,如果你沒有問題的話。

對我使用版本2.7.2中,記錄的方式做工作:

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

這可能在較舊版本的工作。

相反,我發現這種方式通過查看代碼:

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

如果有人有一個文檔的鏈接,隨意添加。

+0

你能解釋一下你將這段代碼放入哪個文件嗎? –

+0

我自己使用'jinja2',所以我只是把它放在'jinja2'解析任何東西之前的任何地方。我不知道把它放在'燒瓶'的位置,因爲我沒有使用它,我希望任何啓動時運行的文件都能正常工作。 – Mark

相關問題