Python--djangoはページング機能を実現

4249 ワード

1.htmlテストデータ
{% extends 'crm_/main_table.html' %}
{% block css %}
    
{% endblock %}
{% block table_ %}
    
{% for l in ls %} {% endfor %}
#
{{ forloop.counter }} {{ l.name }} {{ l.pwd }}
{% endblock %}

2.パッケージのページング機能
'''
   
'''
from django.utils.safestring import mark_safe


class Pagination:
	def __init__(self, request, all_data, pag_data=10, max_pad=11):
		#    URL
		self.base_url = request.path_info
		#         id       id   
		try:
			self.current_pad = int(request.GET.get('id'))
		except Exception as e:
			self.current_pad = 1
		ls = [{'name': 'alex{0}'.format(i), 'pwd': 'dsb{0}'.format(i)} for i in range(1, 302)]

		#          
		self.max_pad = max_pad
		half_pad = self.max_pad // 2

		#           
		self.pag_data = pag_data
		#       
		self.all_data = all_data
		#  divmod    ,        
		self.pads, pad_y = divmod(self.all_data, self.pag_data)
		if pad_y:
			self.pads += 1

			#               
			if self.current_pad <= half_pad:
				self.start_pad = 1
				self.end_pad = self.max_pad
			elif self.current_pad >= self.pads - half_pad:
				self.start_pad = self.pads - self.max_pad + 1
				self.end_pad = self.pads + 1
			else:
				self.start_pad = self.current_pad - half_pad
				self.end_pad = self.current_pad + half_pad
			'''
				1   1   10
				2   10  20
				3   20  30
			'''
			#                 ,            
			if self.pads <= self.max_pad:
				self.start_pad = 1
				self.end_pad = self.pads + 1

	@property
	def StartPage(self):
		return (self.current_pad - 1) * 10

	@property
	def EndPage(self):
		return self.current_pad * 10

	def ActivePage(self):
		#         ,   ""     ,    mark_safe     
		lst = []
		for i in range(self.start_pad, self.end_pad):
			if i == self.current_pad:
				st = '
  • {0}
  • '.format(i) else: st = '
  • {0}
  • '.format(i) lst.append(st) str_ls = mark_safe("".join(lst)) return str_ls def PrePage(self): # if self.current_pad <= 1: st_pr = '
  • ' else: st_pr = '
  • ' \ '«
  • '.format( self.current_pad - 1) st_pr = mark_safe(st_pr) return st_pr def NextPage(self): # if self.current_pad >= self.pads: st_en = '
  • ' else: st_en = '
  • »
  • '.format( self.current_pad + 1) st_en = mark_safe(st_en) return st_en

    3.viewファイルで呼び出す:
    user = [{'name': 'alex{}'.format(i), 'pwd': 'alexdsb{}'.format(i)} for i in range(1, 302)]
    def pad(request):
    	obj = Pagination(request, len(user))
    	return render(request, 'paddingex.html', {
    		'ls': user[obj.StartPage:obj.EndPage],
    		'pads': obj.ActivePage(),
    		'st_pr': obj.PrePage(),
    		'st_en': obj.NextPage()
    	})