Pelican> 正文

Pelican 模板开发中关于使用Paginator的记录

2023-11-05T22:21:33+08:00

  Pelican 模板开发中,关于使用Paginator的一些记录:

Pelican文档地址:https://docs.getpelican.com/en/latest/themes.html

Paginator的相关源代码位于paginator.py文件中,它包含两个类PaginatorPage

1、打开分页功能

pelicanconf.py中设置DEFAULT_PAGINATIONPAGINATION_PATTERNS

# 设置默认每页显示的文章数量为15。
DEFAULT_PAGINATION = 15

PAGINATION_PATTERNS = (
    (1, '{url}', '{save_as}'),
    (2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'),
)

在需要分页的页面模板相应位置上添加:

{% if articles_page.has_other_pages() %}
{% include 'pagination.html' %}
{% endif %}

2、类Paginator

包含一下几个内部属性和一个方法Page:

具体不解释,望名知意即可。

name = name
url = url
object_list = object_list
settings = settings
per_page = per_page
orphans = 0
count #通过 property 装饰器将 _get_count() 方法转换为只读属性
num_pages #通过 property 装饰器将 _get_num_pages() 方法转换为只读属性
page_range  #通过 property 装饰器将_get_page_range()  方法转换为只读属性

Page方法,返回一个Page对象:

def page(self, number):
  .....
  return Page(self.name, self.url, self.object_list[bottom:top], number,
                      self, self.settings)

3、类Page

包含一下几个内部属性和几个函数:

内部属性:

full_name = name
self.name, self.extension = os.path.splitext(name)
dn, fn = os.path.split(name)
base_name = dn if fn in ('index.htm', 'index.html') else self.name
base_url = url
object_list = object_list
number = number
paginator = paginator
settings = settings
url =  #通过 property 装饰器将functools.partial(_from_settings, key='URL')  函数转换为只读属性
save_as = #通过 property 装饰器将functools.partial(_from_settings, key='SAVE_AS')  函数转换为只读属性

函数:

def __repr__(self):return '<Page {} of {}>'.format(self.number, self.paginator.num_pages)
def has_next():
def has_previous(self):
def has_other_pages(self):return self.has_previous() or self.has_next()
def next_page_number(self):
def previous_page_number(self):
def start_index(self):
def end_index(self):

4、一个bootstrap实现的分页功能代码:

文件:pagination.html

使用:在base.html或者pagination.html 加入:

    <link href="https://cdn.bootcdn.net/ajax/libs/bootstrap/5.3.1/css/bootstrap.min.css" rel="stylesheet">

也可以:

<link href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/bootstrap.min.css" rel="stylesheet">

如果全部引入bootstrap会破坏其他样式,只需要分页部分的css,可以将bootstrap的.pagination部分css提取出来:

<link href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/pagination.css" rel="stylesheet">
.pagination {
  display: flex;
  padding-left: 0;
  list-style: none;
}

.page-link {
  position: relative;
  display: block;
  color: #0d6efd;
  text-decoration: none;
  background-color: #fff;
  border: 1px solid #dee2e6;
  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}
@media (prefers-reduced-motion: reduce) {
  .page-link {
    transition: none;
  }
}
.page-link:hover {
  z-index: 2;
  color: #0a58ca;
  background-color: #e9ecef;
  border-color: #dee2e6;
}
.page-link:focus {
  z-index: 3;
  color: #0a58ca;
  background-color: #e9ecef;
  outline: 0;
  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}

.page-item:not(:first-child) .page-link {
  margin-left: -1px;
}
.page-item.active .page-link {
  z-index: 3;
  color: #fff;
  background-color: #0d6efd;
  border-color: #0d6efd;
}
.page-item.disabled .page-link {
  color: #6c757d;
  pointer-events: none;
  background-color: #fff;
  border-color: #dee2e6;
}

.page-link {
  padding: 0.375rem 0.75rem;
}

.page-item:first-child .page-link {
  border-top-left-radius: 0.25rem;
  border-bottom-left-radius: 0.25rem;
}
.page-item:last-child .page-link {
  border-top-right-radius: 0.25rem;
  border-bottom-right-radius: 0.25rem;
}

.pagination-lg .page-link {
  padding: 0.75rem 1.5rem;
  font-size: 1.25rem;
}
.pagination-lg .page-item:first-child .page-link {
  border-top-left-radius: 0.3rem;
  border-bottom-left-radius: 0.3rem;
}
.pagination-lg .page-item:last-child .page-link {
  border-top-right-radius: 0.3rem;
  border-bottom-right-radius: 0.3rem;
}

.pagination-sm .page-link {
  padding: 0.25rem 0.5rem;
  font-size: 0.875rem;
}
.pagination-sm .page-item:first-child .page-link {
  border-top-left-radius: 0.2rem;
  border-bottom-left-radius: 0.2rem;
}
.pagination-sm .page-item:last-child .page-link {
  border-top-right-radius: 0.2rem;
  border-bottom-right-radius: 0.2rem;
}
{% if DEFAULT_PAGINATION %}
{% set first_page = articles_paginator.page(1) %}
{% set last_page =articles_paginator.page(articles_paginator.num_pages) %}
{% set current_page = articles_paginator.page(articles_page.number) %}
{% set total_num = articles_paginator.num_pages %}
{% set current_num = articles_page.number%}
{% set display_num = 5 %}

<nav class="paginator" aria-label="Page navigation example">
    <ul class="pagination">

        {% if current_num> 1 %}
        <li class="page-item">
            <a class="page-link" href="{{ SITEURL }}/{{ articles_paginator.page(1).url }}">首页 </a>
        </li>
        {% endif %}
        {% if articles_page.has_previous() %}

        <li class="page-item"><a class="page-link" href="{{ SITEURL }}/{{ articles_previous_page.url }}">上一页</a></li>
        {% endif %}
        {% for i in range(current_num-display_num,current_num + display_num ) %}
        {% if i>0 and i<= total_num %}

        {% if i== current_num %}
        <li class="page-item active">
            <a class="page-link" href="{{ SITEURL }}/{{ articles_paginator.page(i).url }}">{{ i }} </a>
        </li>
        {% else %}
        <li class="page-item">
            <a class="page-link" href="{{ SITEURL }}/{{ articles_paginator.page(i).url }}">{{ i }} </a>
        </li>
        {% endif %}


        {% endif %}

        {% endfor %}


        {% if articles_page.has_next() %}

        <li class="page-item"><a class="page-link" href="{{ SITEURL }}/{{ articles_next_page.url }}">下一页</a></li>
        {% endif %}
        {% if current_num
        <total_num %}
        <li class="page-item">
            <a class="page-link" href="{{ SITEURL }}/{{ articles_paginator.page(total_num).url }}">末页 </a>
        </li>
        {% endif %}


    </ul>
</nav>

{% endif %}
分享到:

Ranvane的日常记录

关于我们 客服中心 广告服务 法律声明