拆分和排序列表Jinja / Pelican

时间:2015-03-23 22:03:13

标签: python jinja2 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)分为三个部分(将未分类的列表拆分为三部分):

<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然后分成三个相等的部分。

1 个答案:

答案 0 :(得分:1)

使用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>