Как выбрать страницу категории в качестве домашней страницы для сайта Pelican? - PullRequest
6 голосов
/ 26 марта 2019

Я бы хотел, чтобы посетители моего сайта заходили на страницу категории, а не по умолчанию index.html.Я хочу, чтобы они увидели статьи в новостных категориях раньше всего.

Может быть, есть какой-нибудь способ сказать «Пеликану» выводить category/news в index.html?Я знаю, что это было бы возможно с обычными рукописными страницами, использующими поле save_as, но как я могу сделать это с автоматической страницей, сгенерированной Pelican? *

1 Ответ

5 голосов
/ 02 апреля 2019

Ваша домашняя страница, файл 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>

Вышеприведенное повторное использование простой разметки статьи темы.Вы можете ограничить количество новостных статей;в этом случае используйте фильтр 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. -->

В приведенном выше примере рассматриваются первые 5 статей с News в качестве категории.

Поскольку базовая тема повторно использует шаблон index.html для всех отдельных страниц архива (для каждой категории, автора или страницы тега), я бы не стал переопределять index Прямой шаблон здесь.Вместо этого я бы создал новый homepage шаблон (в каталоге страниц) и записал бы его в index.html и.Вам необходимо добавить шаблон в словарь TEMPLATE_PAGES , где страницы шаблона должны находиться в отдельном каталоге, который не должен рассматриваться как статьи или страницы.

Создать новыйкаталог для шаблонов страниц в вашем каталоге содержимого;вам нужно убедиться, что Pelican не пытается рассматривать файлы там как статьи, поэтому добавьте его в список ARTICLE_EXCLUDES .Поэтому, если весь ваш Pelican ваш контент живет в content/, а у вас есть файл homepage.html в каталоге output/templates/, вы будете использовать:

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 в вашей конфигурации:

THEME_TEMPLATES_OVERRIDES = ['overrides']

Теперь, когда Pelican пытается загрузить шаблон index.html, чтобы отобразить шаблон index direct, он сначала будет искать 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 и удалили полный список статей, вы можете удалить index изсловарь PAGINATED_TEMPLATES, поэтому он не генерируется повторно несколько раз, чтобы соответствовать вашему списку статей.

...