我希望我的网站访问者在类别页面上登陆,而不是在默认的index.html上。我想让他们先看看新闻类的文章。
也许有办法让鹈鹕把category/news输出到index.html?我知道在使用save_as字段的普通手写页面中,这是可能的,但是我如何使用鹈鹕生成的自动页面来实现呢?
发布于 2019-04-02 15:56:53
您的主页,即index.html文件,只是来自列表的另一个模板。它将取决于您的主题是如何生成的,但是您始终可以在本地覆盖特定的模板,或者您可以为您的主页创建一个新的模板来替换它(并且可以选择地将原始index.html生成的页面重定向到一个不同的位置)。
无论哪种方式,您都可以生成一个显示单个类别中的文章的部分。所有模板页都被赋予相同的基本变量,其中包括articles列表,以及一个带有(Category, list_of_articles)元组的categories列表。
获取单个特定类别的所有文章的最简单方法是直接使用Jinja2 过滤器筛选Jinja2列表。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>上面的代码重用了简单的主题文章标记。您可能希望限制新闻文章的数量;在这种情况下,使用过滤器和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直接模板。相反,我会创建一个新的homepage模板(在pages目录中)并将其写入index.html和。您需要在字典中添加模板,其中模板页应该位于一个单独的目录中,该目录被配置为不被视为文章或页面。
在内容目录中为模板页创建一个新的目录;您需要确保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 = ['overrides']现在,当鹈鹕试图加载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,这样就不会多次生成与您的文章列表匹配的内容。
https://stackoverflow.com/questions/55363180
复制相似问题