【问题标题】:How can I use Jinja2 to group articles by date and paginate in Pelican?如何使用 Jinja2 在 Pelican 中按日期对文章进行分组和分页?
【发布时间】:2014-03-15 21:44:33
【问题描述】:

我正在使用 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 工作。

【问题讨论】:

  • 好问题。根据帖子编号而不是其他属性(显示每个日期、每个类别等的帖子),鹈鹕分页工作(显示 n 个帖子)似乎存在脱节。

标签: pagination jinja2 pelican


【解决方案1】:

使用 dates_page 变量代替 articles,在此处查看详细信息:http://pelican.readthedocs.org/en/latest/themes.html#index-html

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

【讨论】:

  • 你能详细说明你的答案吗?完全不清楚如何使用 dates_paginator 或 dates_page 变量。
【解决方案2】:

可能为时已晚,无法提供帮助,但我之所以分享,是因为我花了一个晚上的时间来解决这个问题,终于让它在 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 并导致各种错误的其他示例。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    相关资源
    最近更新 更多