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