django 自定义分页,网址存储缓存,CBV
1.
通过切片控制分页
自定义分页:
from django.shortcuts import render # Create your views here. from app01.models import Book
from django.core.paginator import Paginator,EmptyPage
def index(request): ''' 批量插入数据:
# for i in range(100):
# Book.objects.create(title="book_%s"%i,price=i*i) book_list=[] for i in range(100):
book=Book(title="book_%s"%i,price=i*i)
book_list.append(book) Book.objects.bulk_create(book_list) 分页器的使用:
paginator=Paginator(book_list,8) print(paginator.count) # 100
print(paginator.num_pages) # 分页数:13
print(paginator.page_range) # range(1, 14) page=paginator.page(5)
for i in page:
print(i) print(page.has_next())
print(page.has_previous())
print(page.next_page_number())
print(page.previous_page_number()) book_list = Book.objects.all()
paginator = Paginator(book_list, 2)
try: current_page_num=request.GET.get("page",1)
current_page=paginator.page(current_page_num)
except EmptyPage as e:
current_page_num=1
current_page = paginator.page(1) '''
# 自定义分页 print(request.GET) from app01.page import Pagination
current_page_num = request.GET.get("page")
book_list = Book.objects.all()
pagination=Pagination(current_page_num,book_list.count(),request)
''' count=100
per_page=9 current_page_num=1 start 0 end 8
current_page_num=2 start 8 end 16
current_page_num=3 start 16 end 24
current_page_num=n start (n-1)*per_page end n*per_page '''
book_list=book_list[pagination.start:pagination.end] return render(request,"index.html",locals())
View
"""
分页组件使用示例: obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.path_info)
page_user_list = USER_LIST[obj.start:obj.end]
page_html = obj.page_html() return render(request,'index.html',{'users':page_user_list,'page_html':page_html}) """ class Pagination(object): def __init__(self,current_page_num,all_count,request,per_page_num=2,pager_count=11):
"""
封装分页相关数据
:param current_page_num: 当前访问页的数字
:param all_count: 分页数据中的数据总条数
:param per_page_num: 每页显示的数据条数
:param pager_count: 最多显示的页码个数
"""
try:
current_page_num = int(current_page_num)
except Exception as e:
current_page_num = 1 if current_page_num <1:
current_page_num = 1 self.current_page_num = current_page_num self.all_count = all_count
self.per_page_num = per_page_num # 实际总页码
all_pager, tmp = divmod(all_count, per_page_num)
if tmp:
all_pager += 1
self.all_pager = all_pager self.pager_count = pager_count
self.pager_count_half = int((pager_count - 1) / 2) # # 保存搜索条件 import copy
self.params=copy.deepcopy(request.GET) # {"a":"1","b":"2"} @property
def start(self):
return (self.current_page_num - 1) * self.per_page_num @property
def end(self):
return self.current_page_num * self.per_page_num def page_html(self):
# 如果总页码 < 11个:
if self.all_pager <= self.pager_count:
pager_start = 1
pager_end = self.all_pager + 1
# 总页码 > 11
else:
# 当前页如果<=页面上最多显示11/2个页码
if self.current_page_num <= self.pager_count_half:
pager_start = 1
pager_end = self.pager_count + 1#尾页是固定的
# 当前页大于5
else:
# 页码翻到最后
if (self.current_page_num + self.pager_count_half) > self.all_pager: pager_start = self.all_pager - self.pager_count + 1
pager_end = self.all_pager + 1#尾页是固定的 else:
pager_start = self.current_page_num - self.pager_count_half#+5 -5
pager_end = self.current_page_num + self.pager_count_half + 1 page_html_list = [] first_page = '<li><a href="?page=%s">首页</a></li>' % (1,)
page_html_list.append(first_page) if self.current_page_num <= 1:
prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
else:
prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page_num - 1,) page_html_list.append(prev_page) #self.params=copy.deepcopy(request.GET) # {"a":"1","b":"2"} for i in range(pager_start, pager_end):
#照道理来说,深拷贝是不可以添加或修改的,但是这里是可以的
#在返回的请求中通过添加page间而进行定位 self.params["page"]=i if i == self.current_page_num:
temp = '<li class="active"><a href="?%s">%s</a></li>' %(self.params.urlencode(),i)
else:
temp = '<li><a href="?%s">%s</a></li>' % (self.params.urlencode(),i,)
page_html_list.append(temp) if self.current_page_num >= self.all_pager:
next_page = '<li class="disabled"><a href="#">下一页</a></li>'
else:
next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page_num + 1,)
page_html_list.append(next_page)
last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)
page_html_list.append(last_page) return ''.join(page_html_list)
page.py
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body> <ul>
{% for book in book_list %}
<li>{{ book.title }} ---- {{ book.price }}</li>
{% endfor %}
</ul> <nav aria-label="Page navigation">
<ul class="pagination">
{{ pagination.page_html|safe }}......
</ul>
</nav> </body>
</html>
login.html
2.
FBV-----function based view
CBV-----class based view path('index/', views.index),
path('login/', views.LoginView.as_view()),
path('login/', View.as_view.view)
# 用户访问get请求/login/-----------view(request) def view(request):
self = cls(**initkwargs)
return self.dispatch(request, *args, **kwargs) def dispatch(request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
CBV源码
from django.contrib import admin
from django.urls import path from app01 import views urlpatterns = [
path('admin/', admin.site.urls),
path('login/', views.LoginView.as_view()),
]
urls
过程, as_view-- def view -- def dispatch --进行校验,返回
django 自定义分页,网址存储缓存,CBV的更多相关文章
- Django - 自定义分页、FBV和CBV
一.自定义分页(优势在于能够保存搜索条件) """ 分页组件使用示例: 1) 先取出所有数据USER_LIST 2) 实例化: obj = Pagination(requ ...
- Django自定义分页并保存搜索条件
Django自定义分页并保存搜索条件 1.自定义分页组件pagination.py import copy class Pagination: def __init__(self, current_p ...
- Django自定义分页、bottle、Flask
一.使用django实现之定义分页 1.自定义分页在django模板语言中,通过a标签实现; 2.前段a标签使用<a href="/user_list/?page=1"> ...
- Django 自定义分页类
分页类代码: class Page(object): ''' 自定义分页类 可以实现Django ORM数据的的分页展示 输出HTML代码: 使用说明: from utils import mypag ...
- Django—自定义分页
分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页 ...
- Django——自定义分页(可调用)
1.view from django.shortcuts import render,HttpResponse # Create your views here. from app01.models ...
- Django自定义分页
分页 自定义分页 稳扎稳打版 def book(request): # 从URL取参数(访问的页码) page_num = request.GET.get("page") try: ...
- Day24 中间件 自定义分页 ModelForm 序列化 缓存 信号
在views里边,怎么导入局部配置和全局配置 from s18day24 import settings #这样导入的是仅仅用户自定义的配置 from django.conf import setti ...
- django自定义分页控件
1.准备数据 在models创建测试表 from django.db import models class Host(models.Model): hostname = models.CharFie ...
随机推荐
- [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i. ...
- Salesforce 开发整理(七)配置审批流
salesforce提供了比较强大的可配置审批流功能,在系统中翻译为“批准过程”.所以需要配置审批时,选择创建 ——> 工作流和批准 ——> 批准过程,然后选择管理批准过程,选择需要配置 ...
- STM32Cube生成的HID项目,找不到hUsbDeviceFS
症状 在main中尝试发消息给上位机: 解决方法 在STM32生成的HID项目里,默认是没有把hUsbDeviceFS导出的,需要修改usb_device.h文件,在USER CODE BEGIN V ...
- kibana无法显示elasticsearch中的index
我是用的logstash将kafka中的数据同步到elasticsearch.logstash和kafka在同一台服务器,elasticsearch在另外的服务器上. 经过排查,是因为我的logsta ...
- django实战(二)--带多字段模糊查询的分页(也是不容易)
上节我们实现了分页功能,这节我们要实现对模糊查询后的结果进行分页.(引入了bootstrap框架) urls.py from django.urls import path from . import ...
- Qt Quick 常用元素:TabView(选项卡) 与 Slider(滑块)
一.TabView TabView 可以实现类似 Windows 任务管理器的界面,有人叫 TabView 为标签控件,有人又称之为选项卡控件,我们知道它就是这么个东西就行了.现在来介绍 TabVie ...
- github 白嫖记(一)
位运算 按位操作符:0或者1之间的运算 a|b 或 任意一个为1结果为1 console.log(0 | 1) //1 console.log(1 | 0) //1 console.log(1 | 1 ...
- ECS -------------- 更换系统
由于是在云服务器上所以更换系统比较简单 1.首先将你运行的实例停止 点击确定 2. 将停止的系统进行更换 确定 点击批量更改 更换需要的系统 点击确定 更换系统输入手机验证码. 更换好了 3.修改远程 ...
- Flask高级
关于Flask启动,和请求处理 #关于后端服务的启动,无非就是启动实现了WSGI协议的socket #关于flask启动的无非就是下面两段代码 #加载配置,创建Flask对象 app = Flask( ...
- golang--生成某区间的随机数
import ( "crypto/rand" "fmt" "math" "math/big" ) func main() ...