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">&laquo;</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">&raquo;</span></a></li>    <!--点击时超链接到下一页-->
            {% endif %}
            </ul>
     </nav>
    </div>
{% endblock %}

效果

 

 

posted @ 2020-08-14 19:07  inhocho  阅读(54)  评论(0)    收藏  举报