如何选择类别页面作为Pelican网站的主页?

Cam*_*ilB 8 python static-site pelican

我希望我网站的访问者能够进入类别页面,而不是默认页面index.html。我希望他们首先看到“新闻”类别中的文章。

也许有一种方法可以告诉Pelican输出category/newsindex.html?我知道在使用该save_as字段的普通手写页面上可以做到这一点,但是如何使用Pelican生成的自动页面来做到这一点呢?

Mar*_*ers 6

您的首页(index.html文件)只是DIRECT_TEMPLATES列表中的另一个模板。这将取决于你的主题,它究竟是如何产生的,但你总是可以覆盖特定的模板在本地,或者您可以创建您的主页一个新的模板来取代它(任选与原重定向index.html生成的页面到不同的位置)。

无论哪种方式,您都可以生成一个部分来显示单个类别的文章。所有模板页面都具有相同的基本变量,包括articles列表以及categories带有(Category, list_of_articles)元组的列表。

获取单个特定类别的所有文章的最简单方法是articles直接使用Jinja2 selectattr过滤器过滤列表。selectattr('category', '==', categoryname)与类别名称或子词匹配(无论您设置categoryname为什么,都会为您转换为子词)。因此,如果您的类别命名为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>
Run Code Online (Sandbox Code Playgroud)

上面重复了简单的主题文章标记。您可能希望限制新闻报道的数量;在这种情况下使用的batch(size)过滤器连同first

<h2>News:</h2>

<ol id="posts-list" class="hfeed">
{% for article in articles | selectattr('category', '==', 'news') | batch(5) | first %}
    <!-- render article, etc. -->
Run Code Online (Sandbox Code Playgroud)

上面以前5条News为类别。

由于基本主题也为所有单独的存档页面(对于每个类别,作者或标签页面)重复使用index.html模板,因此在此我不会覆盖index直接模板。相反,我将创建一个 homepage模板(在pages目录中)并将其写入index.htmland。您需要将模板添加到TEMPLATE_PAGESdictionary中,其中模板页面应位于单独的目录中,该目录配置为不被视为文章或页面。

在内容目录中为模板页面创建一个新目录;您需要确保Pelican不会尝试将此处的文件视为文章,因此请将其添加到ARTICLE_EXCLUDES列表中。因此,如果您所有的Pelican内容content/都存放homepage.html在中,并且目录中有一个文件,则output/templates/可以使用:

ARTICLE_EXCLUDES = ['templates']
TEMPLATE_PAGES = {
    'templates/homepage.html': 'index.html',
}
Run Code Online (Sandbox Code Playgroud)

这将覆盖index.html为文章生成的默认值,无需删除任何内容,DIRECT_TEMPLATES但您可以这样做以避免生成从未保存的文件。

homepage.html模板可以充分利用主题中的任何现有模板,因此您可以扩展base.html大多数主题将定义的主题:

ARTICLE_EXCLUDES = ['templates']
TEMPLATE_PAGES = {
    'templates/homepage.html': 'index.html',
}
Run Code Online (Sandbox Code Playgroud)

除了覆盖默认值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'
Run Code Online (Sandbox Code Playgroud)

如果您使用的主题不会index.html在更多页面上重复使用该模板,或者您想尝试使模板在这些上下文中仍然有效,则可以替代用于该模板的模板index。要覆盖index.html主题的默认值,请创建一个本地目录(overrides也许)以将本地版本放入其中,然后将该目录添加到配置中的THEME_TEMPLATES_OVERRIDES列表中:

THEME_TEMPLATES_OVERRIDES = ['overrides']
Run Code Online (Sandbox Code Playgroud)

现在,当Pelican尝试加载index.html模板以呈现index直接模板时,它将overrides/index.html首先查找。所以在overrides/添加自己的index.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 %}
Run Code Online (Sandbox Code Playgroud)

关于分页的一句话:除特殊的按归档类型的页面(类别,作者,标签,句点)外,所有模板都分页在完整articles列表上,这是无法进一步配置的。这意味着您不能在单个类别的文章上分页。

这意味着,如果您覆盖index.html模板并删除了完整的文章列表,则可能index要从PAGINATED_TEMPLATES字典中删除,这样就不会多次重新生成字典来匹配您的文章列表。