可重复使用的Jinja2表

时间:2019-09-07 18:21:08

标签: jinja2

我想使用模板创建项目的所有表,但是在编写之后出现了如下错误:

jinja2.exceptions.TemplateSyntaxError: expected token ':', got '}'
{{ table(headers={{headers}},items={{item}},url='None') }}

我看过jinja2网站,但找不到语法错误的答案。

# python 
@app.route('/products')
def products():
    context = {}
    qproducts = list(s.query(Product))
    context['products'] = qproducts
    return render_template('products.html', **context)

# table.html
{% macro table(headers,items,url,var) -%}
<table class='table table-sm table-dark'>
  <thead>
    <tr>
      {{headers}}
    </tr>
  </thead>
  <tbody>
    {% for item in items %}
    <tr onclick="window.location='{{url}}'">
      {{items}}
    </tr>
    {% endfor %}
  </tbody>
</table>
{%- endmacro %}


# products.html
{% from 'table.html' import table %}
{% block headers %}
<th>ID</th>
<th>Price</th>
{%endblock headers%}

{%block item%}
{%for item in products%}
<td>{{item.id}}<td><br>
<td>{{item.price}}<td><br>
{%endfor%}
{%endblock item%}

{{ table(headers={{headers}},items={{item}},url='None') }}

1 个答案:

答案 0 :(得分:1)

即使您固定了对变量的引用(即删除周围的{{ / }}),也无法按预期的方式工作。 block标签只能与extends标签一起使用,但是您可以使用import进行宏导入。如果要编写用于表呈现的通用宏,最好使用macro / call标签的组合:

{% macro table(headers,items,url,var) -%}
<table class='table table-sm table-dark'>
  <thead>
    <tr>
      {{ caller(mode='header') }}
    </tr>
  </thead>
  <tbody>
    {% for item in items %}
    <tr onclick="window.location='{{url}}'">
      {{ caller(mode='row', item) }}
    </tr>
    {% endfor %}
  </tbody>
</table>
{%- endmacro %}

caller是对调用外部提供的回调的特殊函数的引用。然后您可以通过以下方式调用此宏:

{% call(mode, items) table(headers=headers, items=item, url='None') %}
{% if mode='header' %}
<th>ID</th>
<th>Price</th>
{% else %}
{%for item in products%}
<td>{{item.id}}<td><br>
<td>{{item.price}}<td><br>
{% endfor %}
{% endif %}
{% endcall %}

在宏caller中每次提及table都会使用指定的参数调用caller标记的主体。因此,您可以自定义宏的行为。