如何选择类别页面作为 Pelican 站点的主页?
How do I choose a category page to be the home page for a Pelican site?
我希望我网站的访问者登陆类别页面,而不是默认 index.html
。我希望他们先看到新闻类别中的文章。
也许有办法告诉 Pelican 输出 category/news
到 index.html
?我知道这对于使用 save_as
字段的普通手写页面是可能的,但是我如何使用 Pelican 生成的自动页面来做到这一点?
您的主页 index.html
文件只是 DIRECT_TEMPLATES
list 中的另一个模板。这完全取决于您的主题是如何生成的,但您始终可以在本地覆盖特定模板,或您可以为您的主页创建一个新模板来替换它(并可选择重定向原始 index.html
生成的页面到不同的位置)。
无论哪种方式,您都可以生成一个部分来显示来自单个类别的文章。所有模板页面都具有相同的 basic variables,其中包括 articles
列表,以及带有 (Category, list_of_articles)
元组的 categories
列表。
获取单个特定类别的所有文章的最简单方法是直接使用 Jinja2 selectattr
filter 过滤 articles
列表。 selectattr('category', '==', categoryname)
与类别名称或 slug 匹配(无论您将 categoryname
设置为什么都会为您转换为 slug)。因此,如果您的类别名为 News
,那么 'News'
或 'news'
都有效:
<h2>News:</h2>
<ol id="posts-list" class="hfeed">
{% for article in articles | selectattr('category', '==', 'news') %}
<li><article class="hentry">
<header>
<h1><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h1>
</header>
<div class="entry-content">
{% include 'article_infos.html' %}
{{ article.summary }}
<a class="readmore" href="{{ SITEURL }}/{{ article.url }}">read more</a>
{% include 'comments.html' %}
</div><!-- /.entry-content -->
</article></li>
{% endfor %}
</ol>
以上重用了简单的主题文章标记。您可能希望限制新闻文章的数量;在那种情况下使用 batch(size)
filter together with first
:
<h2>News:</h2>
<ol id="posts-list" class="hfeed">
{% for article in articles | selectattr('category', '==', 'news') | batch(5) | first %}
<!-- render article, etc. -->
以上以News
的前5篇文章为分类
由于基本主题 重用 index.html
模板也用于所有单独的存档页面(对于每个类别、作者或标签页),我不会在此处覆盖 index
直接模板。相反,我会创建一个 new homepage
模板(在 pages 目录中)并将其写入 index.html
和。您需要在 TEMPLATE_PAGES
dictionary 中添加模板,您的模板页面应位于单独的目录中,该目录配置为不被视为文章或页面。
在您的内容目录中为 模板页面 创建一个新目录;您需要确保 Pelican 不会尝试将那里的文件视为文章,因此将其添加到 ARTICLE_EXCLUDES
list。因此,如果您所有的 Pelican 内容都在 content/
中,并且您在目录 output/templates/
中有一个文件 homepage.html
,您将使用:
ARTICLE_EXCLUDES = ['templates']
TEMPLATE_PAGES = {
'templates/homepage.html': 'index.html',
}
这将覆盖为文章生成的默认 index.html
,无需从 DIRECT_TEMPLATES
中删除任何内容,但您可以这样做以避免生成您永远不会保留的文件。
homepage.html
模板可以充分利用主题中的任何现有模板,因此您只需扩展 base.html
大多数主题都会定义的:
{% extends "base.html" %}
{% block content %}
<section id="content">
<h2>Recent news:</h2>
<ol>
{% for article in articles | selectattr('category', 'equalto', 'news') | batch(5) | first %}
<!-- markup for each news item -->
{% endfor %}
</ol>
</section><!-- /#content -->
{% endblock content %}
除了覆盖默认的 index
,您还可以设置 INDEX_SAVE_AS
将原始 index.html
文件指向别处:
ARTICLE_EXCLUDES = ['templates']
TEMPLATE_PAGES = {
'pages/homepage.html': 'index.html',
}
# move the original article index elsewhere:
INDEX_SAVE_AS = 'all_articles.html'
如果您使用的主题不会为更多页面重复使用 index.html
模板,或者您想让模板在这些上下文中仍然有效,那么您可以覆盖用于 index
代替。要覆盖主题中的默认 index.html
,请创建一个本地目录(可能是 overrides
)以将本地版本放入其中,然后将该目录添加到配置中的 THEME_TEMPLATES_OVERRIDES
list:
THEME_TEMPLATES_OVERRIDES = ['overrides']
现在,当 Pelican 尝试加载 index.html
模板以呈现 index
直接模板时,它会首先查找 overrides/index.html
。所以在 overrides/
添加你自己的 index.html
:
{% extends "base.html" %}
{% block content %}
<section id="content">
<!-- put your desired content here -->
</section><!-- /#content -->
{% endblock content %}
关于分页的一句话:除了特殊的每个存档类型页面(类别、作者、标签、句点)之外,所有模板都在完整的 articles
列表中分页,这不是什么这是可进一步配置的。这意味着您不能对单个文章类别的主页进行分页。
这意味着如果您重写 index.html
模板并删除了完整的文章列表,那么您可能希望从 PAGINATED_TEMPLATES
词典中删除 index
,这样它就不会重新出现-生成多次以匹配您的文章列表。
我希望我网站的访问者登陆类别页面,而不是默认 index.html
。我希望他们先看到新闻类别中的文章。
也许有办法告诉 Pelican 输出 category/news
到 index.html
?我知道这对于使用 save_as
字段的普通手写页面是可能的,但是我如何使用 Pelican 生成的自动页面来做到这一点?
您的主页 index.html
文件只是 DIRECT_TEMPLATES
list 中的另一个模板。这完全取决于您的主题是如何生成的,但您始终可以在本地覆盖特定模板,或您可以为您的主页创建一个新模板来替换它(并可选择重定向原始 index.html
生成的页面到不同的位置)。
无论哪种方式,您都可以生成一个部分来显示来自单个类别的文章。所有模板页面都具有相同的 basic variables,其中包括 articles
列表,以及带有 (Category, list_of_articles)
元组的 categories
列表。
获取单个特定类别的所有文章的最简单方法是直接使用 Jinja2 selectattr
filter 过滤 articles
列表。 selectattr('category', '==', categoryname)
与类别名称或 slug 匹配(无论您将 categoryname
设置为什么都会为您转换为 slug)。因此,如果您的类别名为 News
,那么 'News'
或 'news'
都有效:
<h2>News:</h2>
<ol id="posts-list" class="hfeed">
{% for article in articles | selectattr('category', '==', 'news') %}
<li><article class="hentry">
<header>
<h1><a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h1>
</header>
<div class="entry-content">
{% include 'article_infos.html' %}
{{ article.summary }}
<a class="readmore" href="{{ SITEURL }}/{{ article.url }}">read more</a>
{% include 'comments.html' %}
</div><!-- /.entry-content -->
</article></li>
{% endfor %}
</ol>
以上重用了简单的主题文章标记。您可能希望限制新闻文章的数量;在那种情况下使用 batch(size)
filter together with first
:
<h2>News:</h2>
<ol id="posts-list" class="hfeed">
{% for article in articles | selectattr('category', '==', 'news') | batch(5) | first %}
<!-- render article, etc. -->
以上以News
的前5篇文章为分类
由于基本主题 重用 index.html
模板也用于所有单独的存档页面(对于每个类别、作者或标签页),我不会在此处覆盖 index
直接模板。相反,我会创建一个 new homepage
模板(在 pages 目录中)并将其写入 index.html
和。您需要在 TEMPLATE_PAGES
dictionary 中添加模板,您的模板页面应位于单独的目录中,该目录配置为不被视为文章或页面。
在您的内容目录中为 模板页面 创建一个新目录;您需要确保 Pelican 不会尝试将那里的文件视为文章,因此将其添加到 ARTICLE_EXCLUDES
list。因此,如果您所有的 Pelican 内容都在 content/
中,并且您在目录 output/templates/
中有一个文件 homepage.html
,您将使用:
ARTICLE_EXCLUDES = ['templates']
TEMPLATE_PAGES = {
'templates/homepage.html': 'index.html',
}
这将覆盖为文章生成的默认 index.html
,无需从 DIRECT_TEMPLATES
中删除任何内容,但您可以这样做以避免生成您永远不会保留的文件。
homepage.html
模板可以充分利用主题中的任何现有模板,因此您只需扩展 base.html
大多数主题都会定义的:
{% extends "base.html" %}
{% block content %}
<section id="content">
<h2>Recent news:</h2>
<ol>
{% for article in articles | selectattr('category', 'equalto', 'news') | batch(5) | first %}
<!-- markup for each news item -->
{% endfor %}
</ol>
</section><!-- /#content -->
{% endblock content %}
除了覆盖默认的 index
,您还可以设置 INDEX_SAVE_AS
将原始 index.html
文件指向别处:
ARTICLE_EXCLUDES = ['templates']
TEMPLATE_PAGES = {
'pages/homepage.html': 'index.html',
}
# move the original article index elsewhere:
INDEX_SAVE_AS = 'all_articles.html'
如果您使用的主题不会为更多页面重复使用 index.html
模板,或者您想让模板在这些上下文中仍然有效,那么您可以覆盖用于 index
代替。要覆盖主题中的默认 index.html
,请创建一个本地目录(可能是 overrides
)以将本地版本放入其中,然后将该目录添加到配置中的 THEME_TEMPLATES_OVERRIDES
list:
THEME_TEMPLATES_OVERRIDES = ['overrides']
现在,当 Pelican 尝试加载 index.html
模板以呈现 index
直接模板时,它会首先查找 overrides/index.html
。所以在 overrides/
添加你自己的 index.html
:
{% extends "base.html" %}
{% block content %}
<section id="content">
<!-- put your desired content here -->
</section><!-- /#content -->
{% endblock content %}
关于分页的一句话:除了特殊的每个存档类型页面(类别、作者、标签、句点)之外,所有模板都在完整的 articles
列表中分页,这不是什么这是可进一步配置的。这意味着您不能对单个文章类别的主页进行分页。
这意味着如果您重写 index.html
模板并删除了完整的文章列表,那么您可能希望从 PAGINATED_TEMPLATES
词典中删除 index
,这样它就不会重新出现-生成多次以匹配您的文章列表。