从Jinja2宏返回一个dict对象

时间:2014-02-06 19:18:19

标签: python jinja2

我有一个辅助宏的单独文件,所以我需要时导入一个。这是一个有问题的宏:

{% macro row_cycler(tiles) -%}
    {%- set row1 = [] -%}
    {%- set row2 = [] -%}
    {%- set row3 = [] -%}
    {%- set row4 = [] -%}
    {%- set rows = cycler(row1, row2, row3, row4) -%}
    {% for column in tiles|batch(4) -%}
        {% for tile in column -%}
            {%- do rows.next().append(tile) -%}
        {%- endfor %}
    {%- endfor %}
    {{ dict(row1=row1, row2=row2, row3=row3, row4=row4) }}
{%- endmacro %}

似乎它返回dict,但事实并非如此。它返回“markupsafe.Markup对象”,它会导致以下内容:

UndefinedError: 'markupsafe.Markup object' has no attribute 'itervalues'

等等。我如何强迫Jinja在没有转换的情况下返回dict?

1 个答案:

答案 0 :(得分:3)

不,宏只能返回模板片段(以Markup个对象的形式),而不是像字典这样的Python对象。改为使用Python代码;为传递到模板中的项添加函数或添加全局模板。

在你的情况下看起来好像你正在重新实现slice() filter,所以在这种情况下甚至可能都不需要。