8

我正在使用 pelican jinja2 模板来生成基于类别的导航菜单,我需要一种方法来控制页面的顺序,或者至少有一个技巧可以让我选择要列出的第一页。

{% for a in articles %}
     {% if a.category == category %}
         <li><a href="{{ SITEURL }}/{{ a.slug }}">{{ a.title }}
     {% endif %}
{% endfor %}

如何使一个特定的文章页面成为第一个。他们的来源是降价格式。

4

5 回答 5

12

Pelican 3.5 将引入对文章和页面排序的内置支持。您可以在您的 pelicanconf.py 中定义应该对文章和页面进行排序的元数据属性。这两个变量是:

ARTICLE_ORDER_BY = 'attribute'
PAGE_ORDER_BY = 'attribute'

要使其正常工作,您必须确保:

  • 每个页面/文章都定义了指定的属性,否则你会得到一个编译器错误,说页面/文章类没有这个属性
  • 您的属性始终使用相同数量的字符;所以值 1、10 和 100 不会产生正确的顺序,但 001、010 和 100 会产生

有了该基础设施,以正确的顺序输出文章应该适用于您的代码而无需修改。

于 2014-09-22T20:19:36.600 回答
9

要解决此问题,您可以禁用自动显示类别和页面并在配置中手动设置菜单项:

DISPLAY_CATEGORIES_ON_MENU = False
DISPLAY_PAGES_ON_MENU = False

MENUITEMS = (
    ('Home', '/'),
    ('Archives', '/archives.html'),
    ('Tags', '/tags.html'),
    ('Category1', 'category/category1.html'),
    ('Category2', 'category/category2.html'),
)
于 2014-07-16T10:52:54.710 回答
7

您可以使用 Pelican 的自定义页面元数据和 Jinja2 的内置排序过滤器进行排序。

示例模板:

{% for pg in PAGES|sort(attribute='sortorder') %}
    <li{% if pg == page %} class="active"{% endif %}><a href="{{ SITEURL }}/{{ pg.url }}">{{ pg.title }}</a></li>
{% endfor %}

示例页面元数据:

title: User's Manual
date: 2014-06-11 15:11
sortorder: 20
于 2014-06-11T23:19:06.017 回答
0

目前看来,这还不可能。在https://github.com/getpelican/pelican/issues/420有一个功能请求和过时的补丁

一旦集成,我将更新答案。

于 2013-08-30T08:16:34.383 回答
0

使用 pelican 4.0.1 和 pelican-bootstrap3 根本不可能对页面和文章类别的菜单项进行排序,因为它们在基本模板中单独排序:首先是页面(已排序),然后是类别(没有'似乎没有排序)。所以页面总是放在类别的前面。

此外,在模板中,页面项目的排序是通过设置选项 PAGES_SORT_ATTRIBUTE 来控制的,因此如果文档中提到的 PAGE_ORDER_BY 选项不起作用,请尝试在您的 pelicanconf.py 中设置该选项。

有点遗憾,但是jcollado 的这个答案似乎确实解决了这个问题,无论如何你会有多少菜单项?

但我不得不稍微调整一下:

DISPLAY_CATEGORIES_ON_MENU = False
DISPLAY_PAGES_ON_MENU = False

MENUITEMS = (
    ('Projects', '/category/projects.html'),
    ('Publications', '/pages/Publications.html'),
    ('Music', '/category/music.html'),
    ('About', '/pages/about.html'),
)

使用正斜杠开始 URI,否则您可能会遇到一些麻烦。

于 2019-02-18T02:46:27.183 回答