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

#python #static-site #pelican

#python #статический сайт #pelican

Вопрос:

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

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

Комментарии:

1. Вы имеете в виду статическую страницу в качестве домашней страницы? docs.getpelican.com/en/4.0.1 /…

2. Нет, я имею в виду страницу категории, которую Pelican генерирует автоматически. Я просмотрел исходный код Pelican, и, похоже, он не допускает вмешательства плагина перед отображением DIRECT_TEMPLATES. Хотя я думаю, что нашел несколько других ссылок для изменения категории save_as еще до рендеринга DIRECT_TEMPLATES. Пока не уверен.

Ответ №1:

Ваша домашняя страница, index.html файл, является просто еще одним шаблоном из DIRECT_TEMPLATES списка. Это будет зависеть от вашей темы, как именно она создается, но вы всегда можете переопределить определенные шаблоны локально, или вы можете создать новый шаблон для своей домашней страницы, чтобы заменить его (и при необходимости перенаправить исходную index.html созданную страницу в другое местоположение).

В любом случае, вы можете создать раздел, в котором будут показаны статьи из одной категории. Всем страницам шаблонов присваиваются одинаковые базовые переменные, которые включают в себя articles список, а также categories список с (Category, list_of_articles) кортежами.

Самый простой способ получить все статьи для одной конкретной категории — это отфильтровать articles список напрямую с помощью selectattr фильтра 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>
  

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

Комментарии:

1. шаблоны ищутся в templates / directory, поэтому TEMPLATE_PAGES = {‘homepage.html ‘: ‘index.html ‘,}

2. @PizzaBeer Я запутался в путях: куда мне поместить файлы? Каковы ссылки на относительный путь.

3. @M.Toya limited docs, исходный код трудно читать. Все, что я знаю, это то, что это работает для меня. Я предполагаю, что это поведение внутри Jinja2, а не pelican. Моя структура следующая: ./theme/templates/subdir/my.html и ./pelicanconf.py. На pelicanconf. py У меня есть TEMPLATE_PAGES = {‘subdir/my.html ‘: ‘index.html ‘,} . Если я скажу ‘templates/subdir/my.html ‘ Я получаю TemplateNotFound