【问题标题】:How can I control the order of pages from within a pelican article category?如何控制鹈鹕文章类别中的页面顺序?
【发布时间】:2013-08-29 20:05:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: python jinja2 pelican


    【解决方案1】:

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

    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'),
    )
    

    【讨论】:

      【解决方案2】:

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

      ARTICLE_ORDER_BY = 'attribute'
      PAGE_ORDER_BY = 'attribute'
      

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

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

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

      【讨论】:

      • 不要忘记将页面中的属性第一个字母大写
      【解决方案3】:

      您可以使用 Pelican 的 custom page metadata 和 Jinja2 的内置 sort 过滤器进行排序。

      示例模板:

      {% 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
      

      【讨论】:

      • 知道为什么排序不适用于 Pelican 3.4 吗?对于上面的示例,它说: pelican.contents.Page 对象没有属性 sortorder。我在页面模板中使用了这种代码。
      • @Sebi 我刚刚用 Pelican 3.4 尝试过,它似乎工作正常。也许您的某个页面没有定义sortorder?您可以尝试使用以下命令进行调试:{% for pg in PAGES %} &lt;!-- {{ pg.__dict__ }} --&gt; {% endfor %}。它应该在 html 输出中添加一个注释,其中包含 Page 对象的所有属性。 sortorder 应该是其中之一。
      • 是的,我也刚找到。每个页面都必须具有此自定义元数据,并且每个页面必须为此属性使用相同数量的字符。例如,1、10、100 等值不起作用,但 001、010 和 100 可以正常工作。在 Pelican 3.5 中,他们引入了全局设置 PAGE_ORDER_BY = 'sortorder',但您必须再次确保在每个页面中定义它并始终使用相同长度的字符。
      • 这里还有一点需要注意 - 模板中的属性名称应该是小写的(即使您页面中的属性名称是大写的)。
      【解决方案4】:

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

      集成后我会更新答案。

      【讨论】:

        【解决方案5】:

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

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

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

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

        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,否则您可能会遇到一些麻烦。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-06
          相关资源
          最近更新 更多