如何使用Pelican将多个独立内容板块合并为一个长静态页面?
如何使用Pelican将多个独立内容板块合并为一个长静态页面?
嘿,我明白你想把三个独立的页面内容合并成一个长静态页的需求,用Pelican完全可以做到!先说说你之前遇到的问题——你用了articles_page变量,但这个变量是给博客文章列表页面用的,而你的landing.md、about.md、contact.md属于Pelican里的Pages(独立页面),不是Articles,所以这个变量自然会报错。下面给你两种实用的解决方案:
方法一:直接在主模板中调用指定Page内容
这种方法简单直接,适合你的固定三个板块的场景:
确保你的三个md文件被识别为Pelican的Page:
- 可以把它们放在
content/pages目录下(Pelican默认会把这个目录下的文件当作Page); - 或者在每个md文件的头部元数据里加上
Status: published,确保内容被发布。
- 可以把它们放在
修改你的
index.html模板,直接遍历pages变量(这个变量包含所有已发布的Page),按slug匹配并输出内容:
{% extends "base.html" %} {% block content %} <!-- 按顺序输出landing、about、contact的内容 --> {% for page in pages %} {% if page.slug == 'landing' %} <h1 style="color: red">{{ page.title }}</h1> {{ page.content }} {% elif page.slug == 'about' %} <h1 style="color: blue">{{ page.title }}</h1> {{ page.content }} {% elif page.slug == 'contact' %} <h1 style="color: green">{{ page.title }}</h1> {{ page.content }} {% endif %} {% endfor %} {% endblock %}
如果担心页面顺序混乱,还可以给每个md文件的元数据加一个Order字段来控制顺序:
- landing.md头部:
Title: Landing Page Order: 1 - about.md头部:
Title: About Us Order: 2 - contact.md头部:
Title: Contact Us Order: 3
然后修改模板里的循环,按Order排序:
{% for page in pages|sort(attribute='order') %} <!-- 匹配逻辑不变 --> {% endfor %}
方法二:保留独立模板片段,按需引入
如果你想保留每个板块的独立模板(比如原来的landing.html、about.html),可以把它们改成模板片段,再在主模板里引入:
把原有的页面模板改成片段文件,比如重命名为
_landing.html、_about.html、_contact.html(下划线开头表示是内部片段,不会单独生成页面),内容保留你原来的样式:- _landing.html:
<h1 style="color: red">{{ page.title }}</h1> {{ page.content }}
- _landing.html:
在
index.html里通过include标签引入这些片段:
{% extends "base.html" %} {% block content %} {% for page in pages|sort(attribute='order') %} {% if page.slug == 'landing' %} {% include '_landing.html' %} {% elif page.slug == 'about' %} {% include '_about.html' %} {% elif page.slug == 'contact' %} {% include '_contact.html' %} {% endif %} {% endfor %} {% endblock %}
这样既能维护每个板块的独立模板,又能把内容整合到同一个长页面里,完全符合你“方便维护内容”的需求。
备注:内容来源于stack exchange,提问作者Malvinka
相关产品推荐
相关产品推荐

