我希望网站的访问者能够进入类别页面,而不是默认的pipenv install --python 'C:\Python373\python373.exe'
。我希望他们首先看到“新闻”类别中的文章。
也许有一种方法可以告诉Pelican将index.html
输出到category/news
吗?我知道使用index.html
字段的普通手写页面可以实现,但是如何使用Pelican生成的自动页面实现呢?
答案 0 :(得分:5)
您的首页index.html
是DIRECT_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)
filter与first
一起使用:
<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 %}
,以免重新生成多次以匹配您的文章列表。