Reuse a block of code in several places in jinja2

佐手、 提交于 2019-12-18 19:07:16

问题


I have this html snippet which needs to be used in lots of places in the jinja2 templates:

<div class="usedalot">{{  somevalue }}</div>

for example, in template1.html, template2.html. template3.html, this code is repeated several places

<!-- template1.html, template2.html. template3.html -->
<div class="usedalot">{{  somevalue }}</div>
......
<div class="usedalot">{{  somevalue }}</div>
....
<div class="usedalot">{{  somevalue }}</div>
......

Instead of copying and pasting, is there someway to use this code snippet as a block? The jinja2 template inheritance (with blocks) do not seem to solve this problem.


回答1:


What you are looking for is called a macro.

Macros are placed in separate files (e.g., macros.html).

{% macro usedalot(somevalue) %}
    <div class="usedalot">{{ somevalue }}</div>
{% endmacro %}

You can then import your macros in other templates

{% from 'macros.html' import usedalot %}

and then use them whenever needed

{{ usedalot(1) }}

This will output

<div class="usedalot">1</div>



回答2:


As of Jinja 2.8, you can also now use block assignments to map a block (still can only be defined once) to a variable that can be used multiple times in the document.

Documentation is at: Block assignments

I just used the feature to drop my HTML page title block into both the title element as well as the meta property for Facebook's opengraph:title attribute.

{% set title_s %}{% block title %}MY DEFAULT TITLE{% endblock %}{% endset %}
<head>
<meta property="og:title" content="{{ title_s }}" />
<title>{{ title_s }}</title>
...
</head>

This seems to me to be a much more clean solution than defining a macro.



来源:https://stackoverflow.com/questions/21275375/reuse-a-block-of-code-in-several-places-in-jinja2

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!