Pelican 模板开发中,关于使用Paginator的一些记录:
Pelican文档地址:https://docs.getpelican.com/en/latest/themes.html
Paginator的相关源代码位于paginator.py
文件中,它包含两个类Paginator
和Page
:
1、打开分页功能
在pelicanconf.py
中设置DEFAULT_PAGINATION
和PAGINATION_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 %}