66.Python-web框架-Django-免費模板django-datta-able的分頁的一種方式

目錄

1.方案介紹

1.1實現效果

1.2django.core.paginator

Paginator 類:

Page 類:

EmptyPage 和 PageNotAnInteger 異常:

1.3 templatetags

2.方案步驟

2.1創建一個common app

2.2創建plugins/_pagination.html

2.3 其他app的views.py查詢方法

2.4在AIRecords.html里使用分頁


1.方案介紹

1.1實現效果

實現方案中使用到:

1.2django.core.paginator

????????django.core.paginator 是 Django 框架中的一個模塊,用于實現數據分頁功能。這個模塊提供了幾個關鍵類和方法,幫助開發者輕松地在視圖中對查詢結果進行分頁處理,從而在前端展示時能夠更加高效和用戶友好。下面是 django.core.paginator 中主要組件的簡介:

  • Paginator 類:

用途: 主要用于將查詢結果集分割成多頁。
參數:
object_list: 需要分頁的對象列表,通常是數據庫查詢的結果。
per_page: 每頁顯示的對象數量,默認為10。
方法:
.count: 返回總對象數。
.num_pages: 返回總頁數。
.page(number): 返回指定頁號的 Page 對象。
.page_range: 返回一個表示所有頁號的范圍對象。

  • Page 類:

????????用途: 表示分頁后的單頁數據,包含當前頁的數據列表和一些分頁信息。
????????屬性:
????????????????number: 當前頁的頁碼。
????????????????object_list: 當前頁的數據列表。
????????????????has_next: 是否有下一頁。
????????????????has_previous: 是否有上一頁。
????????????????next_page_number: 下一頁的頁碼,如果沒有則為None。
????????????????previous_page_number: 上一頁的頁碼,如果沒有則為None。
????????方法:
????????????????.start_index(): 返回當前頁第一條記錄的索引位置(從1開始)。
????????????????.end_index(): 返回當前頁最后一條記錄的索引位置(從1開始)。

  • EmptyPage 和 PageNotAnInteger 異常:

????????當請求的頁碼無效時,如請求的頁碼不是一個整數或超過了實際的頁數,Paginator 在調用 .page() 方法時會拋出這些異常。

1.3 templatetags

?????????在Django中,templatetags 是一個特殊的目錄,位于應用的目錄下,用于存放自定義的模板標簽和過濾器。通過自定義模板標簽和過濾器,開發者可以擴展Django模板系統的功能,使其更加靈活和強大。

2.方案步驟

2.1創建一個common app

考慮到分頁是一個通用的功能,所以創建了一個common app。

在此common app下創建文件夾 templatetags

在templatetags下創建general_tags.py

代碼如下:

from django import templateregister = template.Library()@register.inclusion_tag('plugins/_pagination.html', takes_context=True)
def show_pagination(context):print(context)return {'page_objects':context.dicts[3]['aiRecords'],'search':'','orderby':'',}
  • 'page_objects':context.dicts[3]['aiRecords'],//這句冒號后面的部分,需要根據查詢數據的views里的代碼具體的更改,后面會寫到views.py里的代碼。
  • 'search':'',//這句準備在頁面跳轉時,帶著搜索條件,可以刪減
    
  • 'orderby':''//這句準備在頁面跳轉時,帶著排序字段,可以刪減

2.2創建plugins/_pagination.html

????????在template目錄創建文件夾plugins

????????在plugins下創建_pagination.html


<ul class="pagination m-auto">{% if page_objects.has_previous %}<li class="page-item "><a href="?page=1&orderby={{ orderby }}&search={{ search }}"><span class="page-link"><i class="fa fa-chevron-left" aria-hidden="true"></i>&nbsp;首頁</span></a></li>{% else %}<li class="page-item disabled"><a href=""><span class="page-link">首頁</span></a></li>{% endif %}{% if page_objects.number|add:'-4' > 1 %}<li class ="page-item"><a class="page-link" href="?page={{ page_objects.number|add:'-5' }}&orderby={{ orderby }}&search={{ search }}">&hellip;</a></li>{% endif %}{% for i in page_objects.paginator.page_range %}{% if page_objects.number == i %}<li class="page-item active"><a class="page-link" href=""> {{i}}</a></li>{% elif i > page_objects.number|add:'-5' and i < page_objects.number|add:'5' %}<li class ="page-item" ><a class="page-link" href="?page={{ i }}&orderby={{ orderby }}&search={{ search }}">{{ i }}</a></li>{% endif %}{% endfor %}{% if page_objects.paginator.num_pages > page_objects.number|add:'4' %}<li class ="page-item"><a class="page-link" href="?page={{ page_objects.number|add:'5' }}&orderby={{ orderby }}&search={{ search }}">&hellip;</a></li>{% endif %}{% if page_objects.has_next %}<li class ="page-item" ><a class="page-link" href="?page={{ page_objects.paginator.num_pages }}&orderby={{ order }}&search={{ search }}">尾頁&nbsp;<i class="fa fa-chevron-right" aria-hidden="true"></i></a></li>{% else %}<li class="page-item disabled"><a href=""><span class="page-link">尾頁</span></a></li>{% endif %}</ul>

2.3 其他app的views.py查詢方法

看注釋就好

from django.shortcuts import render
from django.shortcuts import render, redirect
from aivrs import models
from django.core.paginator import Paginator# Create your views here.
# 定義每頁顯示的記錄數
PAGINATOR_NUMBER = 2
def AIRecords(request):"""處理AI記錄的列表頁面請求。參數:- request: Django的HttpRequest對象,包含請求的信息。返回:- 返回一個渲染后的AI記錄列表頁面。"""# 獲取所有AI記錄并按ID排序aiRecords = models.AIRecords.objects.all().order_by('id')# 計算記錄總數count_total = aiRecords.count()# 初始化分頁器,每頁顯示PAGINATOR_NUMBER條記錄paginator = Paginator(aiRecords, PAGINATOR_NUMBER)# 從請求中獲取當前頁碼page = request.GET.get('page')# 如果頁碼不存在,則默認為第1頁if page is None:page = 1# 獲取指定頁碼的記錄aiRecords = paginator.get_page(page)# 渲染并返回AI記錄列表頁面return render(request, 'AIRecords.html', {'aiRecords': aiRecords})

2.4在AIRecords.html里使用分頁

  • {% load general_tags %}

????????這一行代碼是Django模板語言中的標簽,用于在模板文件中加載自定義的模板標簽庫。general_tags是你自定義的標簽庫名稱,意味著在這個模板文件中,你可以使用general_tags庫中定義的所有自定義模板標簽和過濾器。

  • {% show_pagination %}

????????在Django模板中,{% show_pagination %}這一行代碼是一個自定義模板標簽的用法。這個標簽是之前通過{% load general_tags %}加載的general_tags庫中定義的一個標簽,用于展示分頁導航。?

具體代碼如下:

{% extends "layouts/base.html" %}
{% load general_tags %}{% block title %} Management {% endblock %} <!-- Specific CSS goes HERE -->
{% block stylesheets %}{% endblock stylesheets %}{% block content %}<div class="pcoded-content"><div class="pcoded-inner-content"><div class="page-header"><div class="page-block"><div class="row align-items-center"><div class="col-md-12"><div class="page-header-title"><h5 class="m-b-10">AIRecords Management</h5></div></div></div></div></div><!-- [ breadcrumb ] end --><div class="main-body"><div class="page-wrapper"><!-- [ Main Content ] start --><div class="row"><!-- [ basic-table ] start --><div class="col-xl-12"><div class="card"><div class="card-header"><h5>Total {{aiRecords.paginator.count}} records</h5></div><div class="card-block"><div class='row'><div class="col-4"><form class="form-inline mb-2"><div class="form-group mx-sm-3 mb-2"><input type="text" class="form-control" name="search",id='search',placeholder="Search title / author",value={{search}}></div><button type="submit" class="btn btn-secondary mb-2 btn-sm">Search</button></form></div></div><div class="table-responsive "><table class="table table-striped"><thead><tr><th>#</th><th>Ext ID</th><th>Image Name</th><th>Image Path</th><th>Image Url</th><th>OCR Status</th><th>OCR Message</th><th>OCR Time</th><th>Location</th><th>extServiceSystem</th><th>serviceName</th><th>serviceAccessedStatus</th><th>serviceAccessedMessage</th><th>serviceAccessedTime</th><th>Operation</th></tr></thead><tbody>{% for airecord in aiRecords %}<tr><th scope="row">{{airecord.id}}</th><td>{{airecord.extId}}</td><td>{{airecord.imageName}}</td><td>{{airecord.imagePath}}</td><td>{{airecord.imageUrl}}</td><td>{{airecord.ocrStatus}}  </td><td>{{airecord.ocrMessage}}  </td><td>{{airecord.ocrTime|date:"Y/m/d H:i" }}</td><td>{{airecord.ocrLocation}}</td><td>{{airecord.extServiceSystem}}</td><td>{{airecord.serviceName}}</td><td>{{airecord.serviceAccessedStatus}}  </td><td>{{airecord.serviceAccessedMessage}}  </td><td>{{airecord.serviceAccessedTime|date:"Y/m/d H:i" }}</td><td>                                
{#                                                    <a href="{% url 'book_detail' airecord.id%}" class="badge badge-warning"><i class="feather icon-eye"></i></a>#}
{#                                                    <a href="{% url 'book_update' airecord.id%}" class="badge badge-info"><i class="feather icon-edit"></i>&nbsp;Update</a>&nbsp;#}
{#                                                    <a href="{% url 'book_delete' airecord.id%}" class="badge badge-danger"><i class="feather icon-trash-2"></i>&nbsp;Delete</a>&nbsp;#}</td></tr>{% endfor %}</tbody></table></div><div class="row"><div class='col-4'>
{#                                        <a href="{% url 'book_create' %}" class='btn btn-primary'>Add book</a>#}</div><div class='col-8'>{% show_pagination %}</div></div></div></div></div></div></div></div></div>
</div>{% endblock content %}{% block javascripts %}{% endblock javascripts %}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42958.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

入門 Vue Router

Vue Router Vue Router插件做了什么&#xff1f; 全局注冊 RouterView 和 RouterLink 組件。添加全局 $router 和 $route 屬性。啟用 useRouter() 和 useRoute() 組合式函數。觸發路由器解析初始路由。 標簽介紹 RouterView 加載指定頁面 <RouterLink to"/home"…

必剪APP視頻剪輯的字幕制作方法教程!

你是否還在用pr聽一句打一句的制作字幕&#xff1f;你是否還在用ps做字幕然后拉到pr里一句一句的對時間軸&#xff1f;快別用那些老方法啦&#xff0c;繁瑣又浪費時間&#xff01;今天給大家推薦一個方便速度的制作字幕的方法&#xff0c;趕快來看看吧&#xff01; 第一步&…

【Altium】AD-網絡版一個用戶非人為異常占用多個License的解決方法

【更多軟件使用問題請點擊億道電子官方網站】 1、 文檔目標 當出現一個用戶同時占用多個授權&#xff0c;又無法單獨釋放一個授權的情況下&#xff0c;該如何解決。 2、 問題場景 一個用戶獲取網絡版授權后&#xff0c;AD會自動重復獲取授權&#xff0c;直到該license下所有授…

電視盒子變身NAS之安裝termux

此方法適合安卓4.4到安卓9.0都可以用&#xff0c;我目前測試的設備是安卓9.0的電視盒子 第一步&#xff1a;下載安裝termux https://termux.dev/en/ 或者 https://github.com/termux/termux-app/releases 第二步&#xff1a;把apk安裝到你的機頂盒&#xff0c;使用優盤&…

讀書記錄《SQL從小白到大牛》01

讀書記錄《SQL從小白到大牛》01 接地氣的書名&#xff0c;內容應當值得一讀。 第一篇 SQL基礎 01 一些基礎概念 SQL是結構化查詢語言&#xff08;Structured Query Language&#xff09;&#xff0c;是一套用來輸入、更改和查看關系數據庫內容的命令。數據庫發展經歷三個階…

Python自動化與系統安全

信息安全是運維的根本&#xff0c;直接關系到企業的安危&#xff0c;稍有不慎會造成災難性的后果。比如經年發生的多個知名網站會員數據庫外泄事件&#xff0c;信息安全體系建設已經被提到了前所未有的高度。如何提升企業的安全防范水準是目前普遍面臨的問題&#xff0c;主要有…

Swagger的原理及應用詳解(四)

本系列文章簡介: 在當今快速發展的軟件開發領域,特別是隨著微服務架構和前后端分離開發模式的普及,API(Application Programming Interface,應用程序編程接口)的設計與管理變得愈發重要。一個清晰、準確且易于理解的API文檔不僅能夠提升開發效率,還能促進前后端開發者之…

Greenplum(一)【MPP 架構 數據類型】

1、Greenplum 入門 Greenplum 是基于 MPP 架構的一款分布式分析型數據庫&#xff0c;具備關系型數據庫的特點&#xff0c;因為它處理的是結構化的數據&#xff0c;同時具備大數據分布式的特點。 1.1、MPP 架構 MPP&#xff08;Massively Parallel Processing&#xff09;架構是…

從Java開發者到.NET Core初級工程師學習路線:目錄

C#語言基礎 1.1 C#語法概覽 1.2 變量和數據類型 1.3 運算符和表達式 1.4 控制流語句 1.5 方法和參數 1.6 類和對象 1.7 繼承和多態 1.8 接口和抽象類 1.9 委托和事件 1.10 泛型 1.11 LINQ (Language Integrated Query) 1.12 異步編程 (async/await) 1.13 異常處理 1.14 文件I/O…

IOC、DI<3> IServiceConllection 自定義IOC含屬性注入、多實現注入,方法注入

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks;namespace IOC.Common {public class ZenServiceCollection : IZenServiceCollection{// 記錄IOC注冊的抽象、實現private Di…

SpringSecurity初始化過程

SpringSecurity初始化過程 SpringSecurity一定是被Spring加載的&#xff1a; web.xml中通過ContextLoaderListener監聽器實現初始化 <!-- 初始化web容器--><!--設置配置文件的路徑--><context-param><param-name>contextConfigLocation</param-…

sql注入問題批量處理

問題&#xff1a;SQL注入修改&#xff0c;歷史代碼全是${};無法修改的比如表名&#xff0c;列名&#xff0c;動態排序之類的不改&#xff0c;其他的都要修改完成 背景&#xff1a;新公司第一個任務就是SQL注入的修改&#xff0c;歷史sql全部都是${},一個個調整不太合適只能批量…

機場的出租車問題折線圖

分析并可視化機場離場車輛數數據 本文將詳細介紹如何使用Python的正則表達式庫re和繪圖庫matplotlib對機場離場車輛數數據進行分析和可視化。以下是具體步驟和代碼實現。 數據資源&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1rU-PRhrVSXq-8YdR6obc6Q?pwd1234 提…

Android C++系列:Linux常用函數和工具

1. 時間函數 1.1 文件訪問時間 #include <sys/types.h> #include <utime.h> int utime (const char *name, const struct utimebuf *t); 返回:若成功則為 0,若出錯則為- 1如果times是一個空指針,則存取時間和修改時間兩者都設置為當前時間; 如果times是非空指針…

一個python文件實現openai 轉換請求轉換成 ollama

最近在微軟開源了GraphRAG,項目&#xff0c;是一個很棒的項目&#xff0c;本著研究學習的態度下載了該項目測試&#xff0c;發現目前只可以使用openai chat gpt,或azure open chat gpt,也就是說意味著資料要上傳到第三方網站處理&#xff0c;為了本地的ollama也可以使用特意開發…

輪播圖案例

丐版輪播圖 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title> 基礎輪播圖 banner 移入移出</t…

6000字以上論文參考:基于Java+SpringMvc+Vue技術的實驗室管理系統設計與實現

可參考&#xff1a;基于JavaSpringMvcVue技術的實驗室管理系統設計與實現&#xff08;6000字以上論文參考&#xff09;-CSDN博客 論文參考&#xff1a;

【python】字典、列表、集合綜合練習

1、練習1(字典) 字典dic,dic {‘k1’:‘v1’, ‘k2’: ‘v2’, ‘k3’: [11,22,33]} (1). 請循環輸出所有的key dic {"k1": "v1", "k2": "v2", "k3": [11, 22, 33]} for k in dic.keys():print(k)k1 k2 k3(2). 請循環輸…

2024 WAIC|第四范式胡時偉分享通往AGI之路:行業大模型匯聚成海

7月4日&#xff0c;2024世界人工智能大會&#xff08;WAIC&#xff09;正式開幕。此次大會圍繞核心技術、智能終端、應用賦能等板塊展開&#xff0c;展覽規模、參展企業數均達歷史最高。第四范式受邀參展&#xff0c;集中展示公司十年來在行業大模型產業應用方面的實踐。在當天…

【知網CNKI-注冊安全分析報告】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…