必知的技术知识:django自定义分页器

简介: 必知的技术知识:django自定义分页器

app01 --> page


#自定义分页


#官方推荐,页码数为奇数


class PageNation:


def init(self,base_url,current_page_num,total_counts,request,per_page_counts=10,page_number=5,):


'''


:param base_url: 分页展示信息的基础路径


:param current_page_num: 当前页页码


//代码效果参考:http://www.jhylw.com.cn/011324707.html

:param total_counts: 总的数据量

:param per_page_counts: 每页展示的数据量


:param page_number: 显示页码数


'''


self.base_url = base_url


self.current_page_num = current_page_num


self.total_counts = total_counts


self.per_page_counts = per_page_counts


self.page_number = page_number


self.request = request


try:


self.current_page_num = int(self.current_page_num)


except Exception:


self.current_page_num = 1


if self.current_page_num < 1:


self.current_page_num = 1


half_page_range //代码效果参考:http://www.jhylw.com.cn/262834415.html

= self.page_number // 2

# 计算总页数


self.page_number_count, a = divmod(self.total_counts, self.per_page_counts)


if a:


self.page_number_count += 1


if self.current_page_num > self.page_number_count:


self.current_page_num = self.page_number_count


if self.page_number_count <= self.page_number:


self.page_start = 1


self.page_end = self.page_number_count


else:


if self.current_page_num <= half_page_range: #2


self.page_start = 1


self.page_end = page_number #5


elif self.current_page_num + half_page_range >= self.page_number_count:


self.page_start = self.page_number_count - self.page_number + 1


self.page_end = self.page_number_count


else:


self.page_start = self.current_page_num - half_page_range


self.page_end = self.current_page_num + half_page_range


import copy


from django.http.request import QueryDict


self.params = copy.deepcopy(request.GET)


# params【'page'】 = current_page_num


# query_str = params.urlencode()


#数据切片依据,起始位置


@property


def start_num(self):


start_num = (self.current_page_num - 1) self.per_page_counts


return start_num


#数据切片依据,终止位置


@property


def end_num(self):


end_num = self.current_page_num self.per_page_counts


return end_num


# 拼接HTMl标签


def page_html(self):


tab_html = ''


tab_html += ''


#首页


self.params【'page'】 = 1


showye = '首页'.format(self.base_url,self.params.urlencode())


tab_html += showye


# 上一页


if self.current_page_num == 1:


previous_page = '«'


else:


self.params【'page'】 = self.current_page_num - 1


previous_page = '«'.format(


self.base_url,self.params.urlencode())


tab_html += previous_page


#循环生成页码标签


for i in range(self.page_start, self.page_end + 1):


if self.current_page_num == i:


else:


one_tag = '{1}'.format(self.base_url, i,self.params.urlencode())


tab_html += one_tag


# 下一页


if self.current_page_num == self.page_number_count:


next_page = '»'


else:


self.params【'page'】 = self.current_page_num + 1


next_page = '»'.format(self.base_url, self.params.urlencode())


tab_html += next_page


# 尾页


self.params【'page'】 = self.page_number_count


weiye = '尾页'.format(


self.base_url, self.params.urlencode())


tab_html += weiye


tab_html += ''


return tab_html


#函数low鸡版


def pagenation(base_url,current_page_num,total_counts,per_page_counts=10,page_number=5):


'''


total_counts数据总数


per_page_counts每页分多少条数据


page_number = 页码显示多少个


current_page_num 当前页


:return:


'''


# all_objs_list = models.Customer.objects.all()


# total_counts = all_objs_list.count()


# page_number = 5


try:


current_page_num = int(current_page_num)


except Exception:


current_page_num = 1


half_page_range = page_number//2


#计算总页数


page_number_count,a = divmod(total_counts,per_page_counts)


if current_page_num < 1:


current_page_num = 1


if a:


page_number_count += 1


if current_page_num > page_number_count:


current_page_num = page_number_count


start_num = (current_page_num - 1) 10


end_num = current_page_num 10


if page_number_count <= page_number:


page_start = 1


page_end = page_number_count


else:


if current_page_num <= half_page_range:


page_start = 1


page_end = page_number


elif current_page_num + half_page_range >= page_number_count:


page_start = page_number_count - page_number + 1


page_end = page_number_count


else:


page_start = current_page_num - half_page_range


page_end = current_page_num + half_page_range


#拼接HTMl标签


tab_html = ''


tab_html += ''


#上一页


if current_page_num == 1:


previous_page = '«'


else:


previous_page = '«'.format(base_url,current_page_num-1)


tab_html += previous_page


for i in range(page_start,page_end+1):


if current_page_num == i:


one_tag = '{1}'.format(base_url,i)


else:


one_tag = '{1}'.format(base_url, i)


tab_html += one_tag


#下一页


if current_page_num == page_number_count:


next_page = '»'


else:


next_page = '»'.format(base_url,current_page_num+1)


tab_html+=next_page


tab_html += ''


return tab_html,start_num,end_num


app01--> views


from django.shortcuts import render,HttpResponse,redirect


import os


from django.contrib import auth


from app01.models import UserInfo


from crm import settings


from django.views import View


from django import forms


from app01 import models


from django.utils.decorators import method_decorator


from django.contrib.auth.decorators import login_required


# Create your views here.


class RegForm(forms.Form):


username = forms.CharField(


label='用户名',


max_length=12,


min_length=6,


error_messages={


'max_length':'用户名不能超过12位',


'min_length':'用户名不能低于6位',


'required':'用户名不能为空',


}


)


password = forms.CharField(


label='密码',


max_length=16,


min_length=6,


error_messages={


'max_length': '密码不能超过12位',


'min_length': '密码不能低于6位',


'required': '密码不能为空',


},


widget=forms.widgets.PasswordInput(render_value=True),


)


r_password = forms.CharField(


label='密码',


max_length=16,


min_length=6,


error_messages={


'max_length': '密码不能超过12位',


'min_length': '密码不能低于6位',


'required': '密码不能为空',


},


widget=forms.widgets.PasswordInput,


)


def init(self,args,**kwargs):


super().init(args,**kwargs)


for field in self.fields:


self.fields【field】.widget.attrs.update({'class':'form-control'})


def get_valid_img(request):


from PIL import Image


#终极版,方式5


import random


def get_random_color():


return (random.randint(0,255),random.randint(0,255),random.randint(0,255))


from PIL import Image,ImageDraw,ImageFont


img_obj = Image.new('RGB', (236, 34), get_random_color()) #图片对象


draw_obj = ImageDraw.Draw(img_obj) #通过图片对象生成一个画笔对象


font_path = os.path.join(settings.BASE_DIR,'statics/font/ziti.TTF') #获取字体,注意有些字体文件不能识别数字,所以如果数字显示不出来,就换个字体


font_obj = ImageFont.truetype(font_path,16) #创建字体对象


sum_str = '' #这个数据就是用户需要输入的验证码的内容


for i in range(6):


a = random.choice(【str(random.randint(0,9)), chr(random.randint(97,122)), chr(random.randint(65,90))】) #4 a 5 D 6 S


sum_str += a


# print(sum_str)


draw_obj.text((84,10),sum_str,fill=get_random_color(),font=font_obj) #通过画笔对象,添加文字


Width</span>=236


Height</span>=34


# 添加噪线

相关文章
|
10天前
|
Shell 数据库 网络架构
Django+DRF 实战:从异常捕获到自定义错误信息(下)
本文详解了 Django REST Framework 中 ValidationError 的验证流程与优先级,涵盖字段内置验证、自定义验证方法、对象级验证及数据库约束,并通过实战演示如何自定义异常提示信息。
32 1
Django+DRF 实战:从异常捕获到自定义错误信息(下)
|
9天前
|
Python
Django+DRF 实战:自定义异常处理流程
本文详解DRF异常处理流程,包括默认处理机制与自定义异常处理器的实现方法。通过源码分析和实战示例,讲解如何全局捕获并统一返回错误信息,并结合日志记录与友好提示提升项目健壮性。适用于Django进阶开发。
31 4
|
21天前
|
中间件 数据库 Python
Django实战:自定义中间件实现全链路操作日志记录
Django中间件是一套轻量级插件系统,用于全局处理请求与响应。通过自定义中间件可实现如操作日志记录等功能,支持在请求、视图、响应及异常阶段插入逻辑。本文详解中间件生命周期、编写方式及实战案例。
51 1
|
14天前
|
数据安全/隐私保护 网络架构 UED
Django+DRF 实战:从异常捕获到自定义错误信息
本文介绍了DRF(Django REST framework)中的异常处理机制,重点讲解了内置异常类ValidationError的使用场景与示例。同时通过用户注册功能的实战演示,展示了如何在序列化器中自定义参数校验规则,并在视图中捕获并返回结构化的错误信息,提升接口的健壮性与用户体验。
30 0
|
编解码 前端开发 JavaScript
技术经验分享:Django学习日记
技术经验分享:Django学习日记
|
NoSQL Redis Python
技术经验分享:Django实现websocket
技术经验分享:Django实现websocket
84 0
|
11月前
|
前端开发 关系型数据库 Python
Django入门到放弃之分页器
Django入门到放弃之分页器
|
11月前
|
安全 数据库 数据安全/隐私保护
|
11月前
|
安全 中间件 项目管理
Django 后端架构开发:分页器到中间件开发
Django 后端架构开发:分页器到中间件开发
156 1
|
10月前
|
数据库 Python
django中数据库外键可以自定义名称吗
django中数据库外键可以自定义名称吗