为什么从Jinja导入的变量没有显示出来,尽管Pelican应该把它传递给模板?

编程语言 2026-07-09

我在使用Pelican,一款以Jinja模板为基础的静态站点生成器。在Pelican中,某些索引页面会根据元数据自动生成,对每个符合条件的条目都会使用相同的模板进行处理。例如,如果你的一些页面带有“Tag: foo”标签,Pelican会使用模板tag.html生成一个“所有标签为foo的页面”,并且还提供了一个tags.html模板,用来列出并链接到那个“所有标签为foo的页面”。为编写Pelican的 Jinja主题,你需要在生成时传递给特定模板的变量(详见此处 here)。

我想为某个分类创建一个第二个分类索引页,显示该分类中的相同文章,但按不同的元数据字段排序。当前在这一步卡住了;我已经在合适的分类文件夹中创建了一个模板和一个Markdown文件,标注为 “Template: cat2”,但用于列出文章的for循环现在显示为空白。输出的页面看起来就像该分类没有文章。

模板 "cat2.html" 如下:

{% extends "article.html" %}
{% from 'category.html' import articles as cat_articles %}

{% block content %}
<ol>
{% for article in cat_articles %}
    <li>
        <a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a>
    </li>
{% endfor %}
</ol>

{% endblock content %}

到底哪里出错?我猜问题与import有关,这是我第一次使用的Jinja的一个功能。

解决方案

我仍然没有完全掌握Jinja的 imports,但在SO的聊天室里热心的人们澄清了,你不能像这样导入Pelican的变量(我猜是因为Pelican还没有把变量传给模板?)。不过,任何想在Pelican中创建第二个分类页面的人都应该从扩展category ({% extends "category.html" %}) 开始新模板,然后你就可以像在category.html一样与上下文变量交互。

至于问题的第二部分,你可以很容易地使用Jinja标准的if和 for来按自定义元数据进行筛选,例如:

<ol id="foo-list">
    {% for article in articles %}
       {% if (article.custom-metadata | striptags) == "foo" %}
          <li> {{ article. title }} </li>
       {% endif %}
    {% endfor %}
</ol>

("striptags" 用来把它变成字符串。不幸的是Pelican中的Jinja str() 过滤器不起作用。希望有人给出解决办法!)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章