拆分和排序列表 Jinja/Pelican

Split AND sort list Jinja/Pelican

我正在使用 Pelican 生成静态博客。我有一个链接页面,其中包含从中央列表填充的三列。我希望链接按字母顺序 (a) 排序,然后 (b) 分成三个。目前我可以做 (a)(b) 但不能同时做。

(a) 按字母顺序排序(这会产生按字母顺序排序的三个相同的列):

{% for name, link in LINKS|sort %}
<li><a href="{{ link }}">{{ name }}</a></li>
{% endfor %}            
</div>
<div class="l-box pure-u-1-3">
{% for name, link in LINKS|sort %}
<li><a href="{{ link }}">{{ name }}</a></li>
{% endfor %}
</div>
<div class="l-box pure-u-1-3">
{% for name, link in LINKS|sort %}
<li><a href="{{ link }}">{{ name }}</a></li>
{% endfor %}

(b) split into three parts(这将未排序的列表分成三部分):

<div class="l-box pure-u-1-3">
{% for name, link in LINKS[0:10] %}
<li><a href="{{ link }}">{{ name }}</a></li>
{% endfor %}            
</div>
<div class="l-box pure-u-1-3">
{% for name, link in LINKS[11:20] %}
<li><a href="{{ link }}">{{ name }}</a></li>
{% endfor %}
</div>
<div class="l-box pure-u-1-3">
{% for name, link in LINKS[21:30] %}
<li><a href="{{ link }}">{{ name }}</a></li>
{% endfor %}
            </div>

澄清一下。我想按字母顺序对 LINKS 进行排序,然后分成三等份。

使用 slice() 过滤器将您排序的链接分为 3 个独立的组;然后你可以嵌套循环:

{% for column in LINKS|sort|slice(3) %}
<div class="l-box pure-u-1-3">
    {% for name, link in column %}
    <li><a href="{{ link }}">{{ name }}</a></li>
    {% endfor %}
</div>
{% endfor %}

演示:

>>> from jinja2 import Template
>>> template = Template('''
... {% for column in LINKS|sort|slice(3) %}
... <div class="l-box pure-u-1-3">
...     {% for name, link in column %}
...     <li><a href="{{ link }}">{{ name }}</a></li>
...     {% endfor %}
... </div>
... {% endfor %}
... ''')
>>> links = [
...     ('Foo', 'link/to/foo'),
...     ('Bar', 'link/to/bar'),
...     ('Spam', 'link/to/spam'),
...     ('Ham', 'link/to/ham'),
...     ('Eggs', 'link/to/eggs'),
... ]
>>> print template.render(LINKS=links)


<div class="l-box pure-u-1-3">

    <li><a href="link/to/bar">Bar</a></li>

    <li><a href="link/to/eggs">Eggs</a></li>

</div>

<div class="l-box pure-u-1-3">

    <li><a href="link/to/foo">Foo</a></li>

    <li><a href="link/to/ham">Ham</a></li>

</div>

<div class="l-box pure-u-1-3">

    <li><a href="link/to/spam">Spam</a></li>

</div>