django3 分页,标签
自定义过滤器和标签
(1)自定义过滤器
特点:是一个Python函数,至多拥有一个普通参数和必须有一个被过滤参数
步骤:在app 目录下新建python package,名称为templatetags,只有取这个名称启动时才会被加载,新建python
带一个被过滤参数
from django.template import Library
register = Library() #必须用register这个变量)
@register.filter(name = 'male') # 这句装饰器一定要写,表示注册
def my_male(value):
map={0:"女",1:"男"}
return map[value]
在html中使用
{% load p_filters %} 在HTML头加载,这个名字是python文件名
<td> {{ p.sex | male }}</td>
多带一个普通参数的情况
<td> {{ p.pay | add:1}}</td>
内置过滤器
add:? :参数 加 数字相加 字符串拼接 列表拼接
default:? :参数 变量不存在或者为空 显示默认值
filesizeformat 人性化显示文件大小 kb PB
upper 大写
lower 小写
title 首字母大写
ljust:20 左对齐
rjust:20 右对齐
center:20 居中
length 长度
slice:'::' 切片
join:'_' 拼接列表
first 取第一个元素
last 取最后一个元素
safe 取消对HTML代码的转义
date:'Y-m-d H:i:s' 日期的格式化
truncatechars:18 文本上的时候进行截断 按18截断
(2)自定义标签
简单标签
新建python,写入函数,注册,引用,使用
在templatetags新建一个python文件
from django.template import Library
from datetime import datetime
register = Library()
@register.simple_tag(name='current')取个名字
def current_time(format_str = '%Y-%m-%d %H:%M:%S'):
return datetime.now().strftime(format_str)
在HTML中
{% Load teacher_tags %}
{% current %}
包含标签
特点:通过渲染另外一个模板展示数据
同样在templatetags中新建python文件
@register.inclusion_tag('showlist.html')
def show_list(list_data):
return {'lis': list_data}
新建一个showlist.html,包局部的HTML代码放到这文件里
{% for item in lis %}
<tr>
<td> {{ item.name }} </td>
<td> {{ item.age}} </td>
</tr>
{% endfor %}
在另一个html中使用
{% show_list plist%}
分页应用(Django paginator)
一、django项目中引用bootstrap
1、首先下载bootsrtap代码,将下载后的文件放在project下新创建的static目录下。下载jquery放在static/bootstrap/js/目录下。
3、在templates中,新建base.html。。
4、在templates中创建book.html,并继承base.html模版。
{% extends 'base.html' %}
目录结构为:
5、修改全局setting文件,添加静态文件路径。
STATIC_URL = '/static/' #若存放静态文件的static目录在app目录下,则STATIC_URL生效,无需定义下面的
STATICFILES_DIRS = [ #若存放静态文件的static目录在project目录下,则STATICFILES_DIRS生效
os.path.join(BASE_DIR, "static"),
]
6、设置url
在url中设置转发规则
from django.contrib import admin
from django.urls import path,re_path
from mysite import views
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^book', views.bookhandle, name="book")
]
7、定义视图函数 views.py
from django.shortcuts import render
from mysite import models
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
# Create your views here.
def bookhandle(request):
bookdic = models.bookHandle.objects.all()
return render(request, 'book.html',{'book_list':bookdic })
8、修改bash.html中引用boostrap文件,定义钩子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="../static/bootstrap/css/bootstrap.min.css">
<script src="../static/bootstrap/js/jquery-3.2.0.min.js"></script>
<script src="../static/bootstrap/js/bootstrap.min.js"></script>
<script src="../static/bootstrap/js/holder.min.js"></script>
<title>base</title>
</head>
<body>
<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
{% block booklist %}
page content
{% endblock %}
</div>
</body>
</html>
二、book.html
1、新建book.html页面,用来展示book列表。该页面继承父模版base.html,并实现钩子。
{% extends 'base.html' %}
{% block booklist %}
<h3>书籍列表</h3>
<table class="table table-striped">
<thead>
<tr>
<th>书名</th>
<th>简介</th>
<th>出版社</th>
<th>价格</th>
<th>状态</th>
</tr>
</thead>
<tbody>
{% for foo in book_list %}
<tr>
<td>{{ foo.bookname }}</td>
<td>{{ foo.sumary }}</td>
<td>{{ foo.publisher }}</td>
<td>{{ foo.price }}</td>
<td>{{ foo.status }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
2、在static/bootstrap/css目录下创建用于显示不同状态底色的样式文件status_color.css,每个类标签的名字即数据库中客户状态的字段
.soldout{
background-color: orange;
}
.available{
background-color: greenyellow;
}
3、在base.html中添加对status_color.css样式的引用
<link rel="stylesheet" href="../static/bootstrap/css/status_color.css">
book.html显示效果为:

三、分页显示
1、修改views中bookhandle函数
from django.shortcuts import render
from mysite import models
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
# Create your views here.
def bookhandle(request):
bookdic = models.bookHandle.objects.all()
paginator=Paginator(bookdic,2) #每页显示2条
page=request.GET.get('page') #前段请求的页,比如点击'下一页',该页以变量'page'表示
try:
book_obj=paginator.page(page) #获取前端请求的页数
except PageNotAnInteger:
book_obj=paginator.page(1) #如果前端输入的不是数字,就返回第一页
except EmptyPage:
book_obj=paginator.page(paginator.num_pages) #如果前端请求的页码超出范围,则显示最后一页.获取总页数,返回最后一页.比如共10页,则返回第10页.
return render(request, 'book.html',{'book_list':book_obj})
2、修改前端显示页面
在表格后面添加
<div class="pagination">
<span class="step-links">
{% if book_list.has_previous %} <!--如果有上一页-->
<a href="?page={{ book_list.previous_page_number }}">上一页</a> <!--点击时超链接到上一页-->
{% endif %}
<span class="current">
Page{{ book_list.number }} of {{ book_list.paginator.num_pages }} <!--customers_list.number为当前页码,customers_list.paginator.num_pages为总页码数-->
</span>
{% if book_list.has_next %} <!--如果有下一页-->
<a href="?page={{ book_list.next_page_number }}">下一页</a> <!--点击时超链接到下一页-->
{% endif %}
</span>
</div>
效果如下图:

四、使用bootstrap的分页样式
1、分页中只显示一定数量的页码。
在分页中只显示于当前页最近的两页(前两页和后两页)
由于前端页面中不能进行相关算数运算,因此要使用后端的模版,并向前端传回html
在django中自定义模版
(1)在app应用下创建templatetags python目录,该目录必须要有__init__.py文件,新建模板文件 book_table_temp.py

(2)在模版文件中注册模版到django的Library中并返回分页标签
from django import template
from django.utils.html import format_html
register = template.Library()
@register.simple_tag()
def booktemp(current_page,loop_num):
offset = abs(current_page - loop_num)
if offset < 3: # 如果当前循环页数和当前显示的页数的绝对值小于3,就显示该页码
if current_page == loop_num:
# 如果循环页为当前显示页,则加底色
# 第一个loop_num为调转的页码,第二个loop_num为分页标签中显示的,
page_ele = '''<li class="active"><a href="?page= %s">%s<span class="sr-only">(current)</span></a></li>''' % (
loop_num, loop_num)
else:
page_ele = '''<li class=""><a href="?page= %s">%s<span class="sr-only">(current)</span></a></li>''' % (
loop_num, loop_num)
return format_html(page_ele) # 以html返回前端
else:
return ''
(3)前端页面载入模板文件,调用模板中的函数
{% extends 'base.html' %}
{% load book_table_temp %}
{% block title %}
<title>booklist</title>
{% endblock %}
{% block booklist %}
<h3>书籍列表</h3>
<table class="table table-striped">
<thead>
<tr>
<th>书名</th>
<th>简介</th>
<th>出版社</th>
<th>价格</th>
<th>状态</th>
</tr>
</thead>
<tbody>
{% for foo in book_list %}
<tr>
<td>{{ foo.bookname }}</td>
<td>{{ foo.sumary }}</td>
<td>{{ foo.publisher }}</td>
<td>{{ foo.price }}</td>
<td class={{ foo.status }}>{{ foo.status }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="pagination">
<nav>
<ul class="pagination">
{% if book_list.has_previous %} <!--如果有上一页-->
<li class="enabled"><a href="?page={{ book_list.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">«</span></a></li> <!--点击时超链接到上一页-->
{% endif %}
{% for range in book_list.paginator.page_range %}
{% booktemp book_list.number range%} <!--将book_list.number和range当前页面数两个参数传递给book_temp函数-->
{% endfor %}
{% if book_list.has_next %} <!--如果有下一页-->
<li class="enabled"><a href="?page={{ book_list.next_page_number }}" aria-label="Next"><span aria-hidden="true">»</span></a></li> <!--点击时超链接到下一页-->
{% endif %}
</ul>
</nav>
</div>
{% endblock %}
效果


浙公网安备 33010602011771号