我正在使用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">← Previous</a></li>
{% else %}
<li class="prev disabled"><a href="#">← 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 →</a></li>
{% else %}
<li class="next disabled"><a href="#">→ 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工作。
答案 0 :(得分:1)
使用 dates_page 变量代替文章,详见此处:http://pelican.readthedocs.org/en/latest/themes.html#index-html
答案 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
并导致各种错误的其他示例。
底部的代码块根据需要加载分页模板。