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

Posted

技术标签:

【中文标题】如何选择类别页面作为 Pelican 网站的主页?【英文标题】:How do I choose a category page to be the home page for a Pelican site? 【发布时间】:2019-08-17 04:37:06 【问题描述】:

我希望我网站的访问者登陆一个类别页面,而不是默认的index.html。我希望他们先查看新闻类别中的文章。

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

【问题讨论】:

你的意思是有一个静态页面作为首页? docs.getpelican.com/en/4.0.1/… 不,我的意思是分类页面,它是 Pelican 自动生成的。我浏览了 Pelican 源代码,它似乎在渲染 DIRECT_TEMPLATES 之前不允许插件干预。尽管我认为甚至在渲染 DIRECT_TEMPLATES 之前我发现了一些其他导致更改类别 save_as 的线索。还不确定。 【参考方案1】:

您的主页index.html 文件只是DIRECT_TEMPLATES list 的另一个模板。这将取决于您的主题究竟是如何生成的,但您始终可以在本地覆盖特定模板,您可以为您的主页创建一个新模板来替换它(并且可以选择重定向原始 @987654333 @生成的页面到不同的位置)。

无论哪种方式,您都可以生成一个显示单个类别的文章的部分。所有模板页面都被赋予相同的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 与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 %

关于分页的一句话:所有模板,除了特殊的 per-archive-type 页面(类别、作者、标签、句点),都在完整的 articles 列表中分页,这不是可以进一步配置的东西.这意味着您不能在单一类别的文章上对主页进行分页。

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

【讨论】:

模板在 templates/ 目录中搜索,因此 TEMPLATE_PAGES = 'homepage.html': 'index.html', @PizzaBeer 我对路径感到困惑:我应该把文件放在哪里?相对路径的参考是什么。 @M.Toya 有限文档,源代码难以阅读。我只知道它对我有用。我的猜测是这种行为在 Jinja2 内部,而不是鹈鹕内部。我的结构如下:./theme/templates/subdir/my.html 和 ./pelicanconf.py。在 pelicanconf.py 我有 TEMPLATE_PAGES = 'subdir/my.html': 'index.html', 。如果我说 'templates/subdir/my.html' 我会得到一个 TemplateNotFound

以上是关于如何选择类别页面作为 Pelican 网站的主页?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 中如何实现tabControl1控件页面跳转?通过主页面上的菜单栏(见图)选择后,并跳出相应的页面

如何选择与另一个页面具有相同类别的多个图像

DropDownList 总是删除第一个值?

如何在magento 1.9中的cms主页滑块上显示类别?

动态更改主页按钮链接

在主页和类别页面中限制 woocommerce 产品简短描述