templates - 如何输出动态嵌套的项目符号列表?

标签 templates flask jinja2 bulletedlist

我正在输出北美发生的事件列表,我想按国家/地区进行分割,然后按地区进行分割。给定以下数据:

CA Event 1, Edmonton, AB, Canada
CA Event 2, Edmonton, AB, Canada
CA Event 3, Burnaby, BC, Canada
BE Event 1, Brussels, NULL, Belgium
US Event 1, Juneau, AK, USA
US Event 2, Birmingham, AL, USA
US Event 3, Silverhill, AL, USA

我想要如下所示的输出

Canada
    Alberta
        CA Event 1, Edmonton, AB, Canada
        CA Event 2, Edmonton, AB, Canada
    British Columbia
        CA Event 3, Burnaby, BC, Canada
Belgium
    BE Event 1, Brussels, Belgium
USA
    Alaska
        US Event 1, Juneau, AK, USA
    Alabama
        US Event 2, Birmingham, AL, USA
        US Event 3, Silverhill, AL, USA

我目前已经通过输出嵌套项目符号列表来完成这项工作,但我正在努力找出如何避免重复的 UL 标签。同样,给定上面的输入数据,所需的 HTML 输出应如下所示:

<h2>Canada</h2>
<h3>Alberta</h3>
<ul>
    <li>CA Event 1, Edmonton, AB, Canada</li>
    <li>CA Event 2, Edmonton, AB, Canada</li>
</ul>
<h3>British Columbia</h3>
<ul>
    <li>CA Event 4, Burnaby, BC, Canada</li>
</ul>

但现在看起来像这样:

<h2>Canada</h2>
<h3>Alberta</h3>
<ul>
    <li>CA Event 1, Edmonton, AB, Canada</li>
</ul>
<ul>
    <li>CA Event 2, Edmonton, AB, Canada</li>
</ul>
<h3>British Columbia</h3>
<ul>
    <li>CA Event 4, Burnaby, BC, Canada</li>
</ul>

这是我的模板代码,它使用 Jinja 模板语言作为 Flask 的一部分,但任何响应并不特别需要它。我只是不知道如何只在需要时输出 UL 标签。

{% set ns = namespace() %}
{% set ns.country_header = '' %}
{% set ns.region_header = '' %}

{% for convention in context.conventions %}

    {% if ns.country_header != convention.country %}
        {% set ns.country_header = convention.country %}
        <h3>{{ns.country_header}}</h3>
    {% endif %}

    {% if ns.region_header != convention.region %}
        {% set ns.region_header = convention.region %}
        <h4>{{ns.region_header}}</h4>
    {% endif %}

    <ul>
        <li>
            {{convention.name}} – 
            {{convention.city}}, {{convention.region}} {% endif %}
        </li>
    </ul>
{% endfor %}

最佳答案

警告:我不会专门讲这种模板语言,但我确实讲逻辑。

啊,平淡的唱片列表的乐趣。 :/

发出<ul>当区域标题发生变化时——基本上作为 <h4> 的一部分标签。

您必须发出 </ul>在你考虑 <h3> 之前,在循环的顶部或<h4>项目,通过检查是否发生了变化。

作为一种特殊情况,第一次进入循环时,必须避免发出 </ul> .

您可以发出 </ul> endfor之后.

{% for convention in context.conventions %}
    {% if <<not first record>> %}
      </ul> 
    {% endif %}

    {% if ns.country_header != convention.country %}
        {% set ns.country_header = convention.country %}
        <h3>{{ns.country_header}}</h3>
    {% endif %}

    {% if ns.region_header != convention.region %}
        {% set ns.region_header = convention.region %}
        {% if convention.region != "NULL" %}
        <h4>{{ns.region_header}}</h4>
        {% endif %}
      <ul>
    {% endif %}

        <li>
            {{convention.name}} – 
            {{convention.city}}, {{convention.region}} {% endif %}
        </li>
{% endfor %}
{% if << at least one record >> %}
    </ul>
{% endif %}

注意:我想我看到了一个额外的 {% endif %}<li> block 。

注释 2:此循环将无法发出 <h4>如果州/省的记录与 <h3> 中的最后一条记录相同,则可能会发生这种情况。多于。想想“俄罗斯/格鲁吉亚”**和“美国/格鲁吉亚”。您可能想要清除 ns.region_header在你的<h3>为了安全起见,发出 block 。

** 有人可能会因为我称格鲁吉亚为俄罗斯的一部分而骚扰我。但这是我能快速想到的唯一一个半明显的例子。

关于templates - 如何输出动态嵌套的项目符号列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57735479/

相关文章:

javascript - 尝试在 html 导入中选择模板元素时获取 null

c++ - 从专门的方法中捕获异常

c++ - 如何使用模板处理多类型变量?

python - 将 Flask AutoIndex 绑定(bind)到 http ://localhost? 以外的其他 URL

python - 同一页面上具有相同 radio 字段的多个 WTForm

c++ - 如何在 C++ 中使用类模板声明新运算符

javascript - 在JS中生成csv并使用ajax请求POST将其发送到flask

java - jinja2 宏与 jsp2.0 标签

python - 在Google App Engine中,如何使用python通过 bool 值进行查询?

java - 在 App Engine 上使用 Java 中的 Python 代码