如何使用Jinja2按日期分组文章并在Pelican中分页?

时间:2014-02-16 17:31:47

标签: pagination jinja2 pelican

我正在使用Pelican静态站点生成器来创建一个高容量的博客。 Pelican主题对索引页面进行分页,显示帖子标题和摘要列表,按日期对帖子进行排序。以下是bootstrap theme

中如何完成此操作的示例
{% if articles %}
{% for article in (articles_page.object_list if articles_page else articles) %}
<div class='article'>
<h2>{{ article.title }}</h2>
<div class="well small">{% include "metadata.html" %}</div>
<div class="summary">{{ article.summary }} <a class="btn primary xsmall" href="{{ SITEURL }}/{{ article.url }}">more…</a>
</div>
</div>  
{% endfor %}
{%endif%}

这是分页导航的标准代码:

{% if articles_page and articles_paginator.num_pages > 1 %}
<div class="pagination">
<ul>
{% if articles_page.has_previous() %}
    {% set num = articles_page.previous_page_number() %}
    <li class="prev"><a href="{{ SITEURL }}/{{ page_name }}{{ num if num > 1 else '' }}.html">&larr; Previous</a></li>
{% else %}
    <li class="prev disabled"><a href="#">&larr; Previous</a></li>
{% endif %}
{% for num in range( 1, 1 + articles_paginator.num_pages ) %}
    <li class="{{ 'active' if num == articles_page.number else '' }}"><a href="{{ SITEURL }}/{{ page_name }}{{ num if num > 1 else '' }}.html">{{ num }}</a></li>
{% endfor %}
{% if articles_page.has_next() %}
    <li class="next"><a href="{{ SITEURL }}/{{ page_name }}{{ articles_page.next_page_number() }}.html">Next &rarr;</a></li>
{% else %}
    <li class="next disabled"><a href="#">&rarr; Next</a></li>
{% endif %}

由于我的网站有很多信息可以在一个小空间内共享 - 有时每天有20篇文章 - 我写的摘要只适合一行。我希望索引页面按日期对帖子进行分组,而不是列出每个帖子的日期,如下所示:

2014年2月1日
发布1 邮政2
发布3

2014年2月2日
发布1 发布2

以下是使用Jinja2按日期分组文章的方法:

{% if articles %}
{% for year, year_articles in articles|groupby('date.year')|sort(reverse=True) %}
{% for month, month_articles in year_articles|groupby('date.month')|sort(reverse=True) %}
{% for day, day_articles in month_articles|groupby('date.day')|sort(reverse=True) %}
<dl>
    <dt>{{ day_articles[0].date.strftime('%d %B %Y') }}</dt>
        {% for article in day_articles %}
        <dd>
        <a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a>
        </dd>
        {% endfor %}
</dl>
{% endfor %}
{% endfor %}
{% endfor %}
{% endif %}    

我希望将这些功能组合在一起,以便按日期和分页对文章进行分组。到目前为止,我承认的猜测失败了。我开始使用100篇文章,每页显示10篇文章;在我的尝试中,索引列出了10页的文章,但它显示了每个页面上的所有文章。我对任何有效的解决方案都很满意。任何想法如何进行?

进一步的想法
也许Jinja if-loop可以识别为该日期列出的第一篇文章并写下日期,然后是链接的文章标题等,而不是所有的分组。对于所有后续文章,它将跳过打印日期并编写链接的文章我不知道该如何做到这一点,并且if-loop仍然必须避免将分页器从其游戏中剔除。但如果它有效,创建一个漂亮的列表是一个CSS工作而不是Jinja工作。

2 个答案:

答案 0 :(得分:1)

使用 dates_page 变量代替文章,详见此处:http://pelican.readthedocs.org/en/latest/themes.html#index-html

  • dates_paginator文章列表的paginator对象,按日期排序,升序。
  • dates_page文章的当前页面,按日期排序,升序。

答案 1 :(得分:1)

可能为时已晚,无法提供帮助,但是我正在分享,因为我刚刚花了一个晚上与之抗争,最终使其在Pelican 4.2中工作。我没有按单个日期进行分组,但这仍然可以在一天中进行额外的内部循环:

{% for year, year_group in dates_page.object_list|groupby('date.year')|reverse %}
    {% for month, month_group in year_group|groupby('date.month')|reverse %}
        <h1>{{ (month_group|first).date|strftime('%B %Y') }}</h1>
        {% for article in month_group %}

            ... do stuff with individual article here ...

        {% endfor %}
    {% endfor %}
{% endfor %}

{% if dates_page.has_other_pages() %}
    {% include 'pagination.html' %}
{% endif %}

关键是要使用 dates_page.object_list 开始外部循环; dates_page提供按日期排序的文章的分页列表,而object_list是可迭代的,提供模板使用的实际文章列表。我尝试使用省略的object_list并导致各种错误的其他示例。

底部的代码块根据需要加载分页模板。