2015-05-19 11 views
6

Как передать два аргумента [docs]? Это хорошо работает, если я использую только один аргумент. Но в этом случае мне нужно два.app_template_filter с несколькими аргументами

@mod.app_template_filter('posts_page') 
def posts(post_id, company_id): 
    pass 

{{ post.id, post.company.id | posts_page }} 

Ошибка:

TypeError: posts_page() takes exactly 2 arguments (1 given) 

ответ

7

С Jijna docs,

Variables can be modified by filters. Filters are separated from the variable by a pipe symbol (|) and may have optional arguments in parentheses. Multiple filters can be chained. The output of one filter is applied to the next.

Фильтры предназначены для изменения по одной переменной за раз. Вы ищете context processor:

Variables are not limited to values; a context processor can also make functions available to templates (since Python allows passing around functions)

Например,

@app.context_processor 
def add(): 
    def _add(int1, int2): 
     return int(int1) + int(int2) 
    return dict(add=_add) 

можно использовать в шаблоне, как

{{ add(a, b) }} 

Вы можете принять это в качестве метода posts_page:

@app.context_processor 
def posts_page(): 
    def _posts_page(post_id, company_id): 
     # ... 
     return value 
    return dict(posts_page=_posts_page) 
0

Хотя вы можете использовать контекстный процессор, это может быть не всегда то, что вы хотите.

Документах фрагмент кода в принятом ответ говорит:

[Filters] may have optional arguments in parentheses.

Таким образом, глядя на шаблон фильтра Аскер в:

@mod.app_template_filter('posts_page') 
def posts(post_id, company_id): 
    pass 

справедливо следующее в шаблоне:

{{ post.id|posts_page(post.company_id) }} 
Смежные вопросы