如何避免在基本模板中渲染块 - 或者:如何定义多行块状变量?

时间:2018-06-11 10:13:40

标签: python jinja2 templating-engine

我对忍者来说比较新,所以请原谅这个可能愚蠢的问题......

我有一个jinja宏坐在名为import sys from functools import partial from PyQt4 import QtGui,QtCore def move_scrollbar(vs, value): vs.blockSignals(True) vs.setValue(value) vs.blockSignals(False) def window(): app = QtGui.QApplication(sys.argv) win = QtGui.QWidget() main_horizontal = QtGui.QHBoxLayout() verti_1 = QtGui.QVBoxLayout() verti_2 = QtGui.QVBoxLayout() list1 = QtGui.QListWidget() for i in range(20): list1.addItem(str(i)) list2 = QtGui.QListWidget() for i in range(20): list2.addItem("name" + str(i)) verti_1.addWidget(list1) verti_2.addWidget(list2) vs1 = list1.verticalScrollBar() vs2 = list2.verticalScrollBar() vs1.valueChanged.connect(partial(move_scrollbar, vs2)) vs2.valueChanged.connect(partial(move_scrollbar, vs1)) main_horizontal.addLayout(verti_1) main_horizontal.addLayout(verti_2) win.setLayout(main_horizontal) win.resize(400,200) win.show() sys.exit(app.exec_()) if __name__ == "__main__": window() 的文件中,如下所示

const input = {
  artists: [
    {
      name: 'Martin Garrix',
      origin: 'Netherlands',
      age: '22 years old',
      artist_id: 'c0dc129d8a886a2c9bf487b826c3614a6630fb9c',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/98081145&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },

    {
      name: 'Armin van Buuren',
      origin: 'Netherlands',
      age: '41 years old',
      artist_id: '8b0a178ce06055312456cccc0c9aa7679d8054f1',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/181749728&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },

    {
      name: 'Don Diablo',
      origin: 'Netherlands',
      age: '38 years old',
      artist_id: '178c6e7e3bf24710d4895048586a86f1bb81d842',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/212802517&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },

    {
      name: 'David Guetta',
      origin: 'France',
      age: '50 years old',
      artist_id: 'c2714423228a8012ad37af0186447cbb7ff589f7',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/140006470&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },

    {
      name: 'Alesso',
      origin: 'Sweden',
      age: '26 years old',
      artist_id: '69fa09f6e181093fe0ea2ce1a4099066509f7837',
      best_song:
        'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/288914798&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true',
    },
  ],
};
const minAge = 40;

const output = input.artists.filter(cur => minAge < parseInt(cur.age));
console.log(output);

我从另一个名为lib.jinja的文件中导入它,其大致如下所示:

{% macro some_macro(some_content) %}
    <div class="some_class">{{ some_content }}</div>
{%- endmacro %}

渲染输出如下所示:

content.htm

请注意,内容显示两次,一次通过宏呈现,另一次 - 直接在上面 - 呈现,就像它在{% from "lib.jinja" import some_macro %} {% block content %} Some content {% endblock %} {{ some_macro(self.some_macro(self.content())) }} 中名为内容的块中定义的那样。我希望避免将块渲染两次 - 它应该被输入宏并仅通过它渲染。

我似乎可以&#34;解决问题&#34;将Some content <div class="some_class">Some content</div> 转换为空基础模板的子模板(通过在其顶部添加content.htm标记)。

也许我对这里的概念缺乏了解:一个块不是变量 - 我明白了。如果没有content.htm标记,我会假设模板被视为基本模板。如果没有子模板或其他指令,我想该块只是按原样呈现,然后,第二次可以这么说,由宏拾取 - 正确吗?

我怎样才能以理智的方式解决这个问题,即如何通过扩展空基础模板来处理这个问题?是否有其他类型的块或变量可以满足我的需求?

1 个答案:

答案 0 :(得分:0)

在我提交此问题后,我终于在手册中找到了我想要的内容:Block Assignments

{% from "lib.jinja" import some_macro %}
{% set content %}
    Some content
{% endset %}
{{ some_macro(self.some_macro(content)) }}

setendset代码解决了我的问题。