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

时间:2019-03-26 17:36:22

标签: python static-site pelican

我希望网站的访问者能够进入类别页面,而不是默认的pipenv install --python 'C:\Python373\python373.exe' 。我希望他们首先看到“新闻”类别中的文章。

也许有一种方法可以告诉Pelican将index.html输出到category/news吗?我知道使用index.html字段的普通手写页面可以实现,但是如何使用Pelican生成的自动页面实现呢?

1 个答案:

答案 0 :(得分:5)

您的首页index.htmlDIRECT_TEMPLATES list中的另一个模板。这完全取决于您的主题的生成方式,但是您始终可以在本地覆盖特定模板,或者您可以为首页创建一个新模板来替换它(并可以重定向原始{{ 1}}生成的页面移到其他位置。

无论哪种方式,您都可以生成一个部分来显示单个类别的文章。所有模板页面都具有相同的basic variables,其中包括index.html列表以及包含articles元组的categories列表。

获取单个特定类别的所有文章的最简单方法是直接用Jinja2 selectattr filter过滤(Category, list_of_articles)列表。 articles与类别名称或子词都匹配(无论您将selectattr('category', '==', categoryname)设置为什么,都会为您转换为子词)。因此,如果您的类别命名为categoryname,则News'News'均适用:

'news'

以上内容重复使用了简单的主题文章标记。您可能希望限制新闻报道的数量;在这种情况下,请将batch(size) filterfirst一起使用:

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

以上内容以<h2>News:</h2> <ol id="posts-list" class="hfeed"> {% for article in articles | selectattr('category', '==', 'news') | batch(5) | first %} <!-- render article, etc. --> 作为类别的前5篇文章。

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

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

homepage.html

这将覆盖为文章生成的默认output/templates/,无需从ARTICLE_EXCLUDES = ['templates'] TEMPLATE_PAGES = { 'templates/homepage.html': 'index.html', } 中删除任何内容,但是您可以这样做以避免生成您从未保存的文件。

index.html模板可以充分利用主题中所有现有的模板,因此您可以扩展大多数主题将定义的DIRECT_TEMPLATES

homepage.html

除了覆盖默认的base.html之外,您还可以设置INDEX_SAVE_AS将原始{% 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.html模板,或者您想尝试使模板在这些情况下都能正常使用,则可以覆盖{{1 }}。要从您的主题中覆盖默认的ARTICLE_EXCLUDES = ['templates'] TEMPLATE_PAGES = { 'pages/homepage.html': 'index.html', } # move the original article index elsewhere: INDEX_SAVE_AS = 'all_articles.html' ,请创建一个本地目录(也许是index.html)以将您的本地版本放入其中,然后将该目录添加到您的配置中的THEME_TEMPLATES_OVERRIDES list中:

index

现在,当Pelican尝试加载index.html模板以呈现overrides直接模板时,它将首先查找THEME_TEMPLATES_OVERRIDES = ['overrides'] 。因此,在index.html中添加您自己的index

overrides/index.html

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

这意味着,如果您覆盖index.html模板并删除了完整的文章清单,那么您可能希望从PAGINATED_TEMPLATES字典中删除{% extends "base.html" %} {% block content %} <section id="content"> <!-- put your desired content here --> </section><!-- /#content --> {% endblock content %} ,以免重新生成多次以匹配您的文章列表。