Django分頁完整示例

2021-02-14 python運維技術
大家好,在這篇文章中,我們將展示django的分頁完整的一個實例,當我們打算用Django中開發博客時,需要將帖子列表分別展示到多個頁面上,在這方面,Django具有內置的分頁類,可管理分頁數據。所有分頁方法都使用Paginator類。它實際上是承擔將QuerySet拆分為Page對象的工作。在django中可以使用兩種方法進行分頁,第一種方法是使用基於函數的視圖,第二種方法是使用基於類的視圖。

現在,首先,需要使用此命令創建一個新的django項目。我稱這個項目為MyProject

django-admin startproject ProjectName

首先,需要將目錄更改為已創建的項目,然後需要創建一個App,我將其稱為MyApp。
python manage.py startapp MyApp

另外,還需要在settings.py(INSTALLED_APPS)中添加新創建的應用。
INSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'MyApp']

另外,還需要創建一個模板文件夾,因為我們需要向模板文件夾中添加一些html文件,請確保在創建模板文件夾後需要打開settings.py並將模板目錄添加到DIRS部分中,如下所示。
TEMPLATES = [    {        'BACKEND': 'django.template.backends.django.DjangoTemplates',        'DIRS': ['templates'],

1:基於函數的視圖中的分頁
 
現在,首先,需要在應用程式中打開models.py文件並創建模型。
from django.db import modelsfrom django.utils import timezone


class Post(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=100) body = models.TextField() publish = models.DateTimeField(default=timezone.now())

def __str__(self): return self.title

基本上,我們有一個具有四個沒有id的欄位的模型。之後,需要進行這樣的遷移。
python manage.py makemigrationspython manage.py migrate

首先,需要打開views.py文件並創建視圖功能。
from django.shortcuts import renderfrom .models import Postfrom django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerdef Index(request):    post_list = Post.objects.all()    paginator = Paginator(post_list, 2)    page = request.GET.get('page')
try: posts = paginator.page(page) except PageNotAnInteger: posts = paginator.page(1)
except EmptyPage: posts = paginator.page(paginator.num_pages)
return render(request, 'index.html', {'page':page,'posts':posts})

可以看到我們已經在索引視圖功能中完成了分頁確定,現在需要在創建的應用程式中創建一個新的urls.py。並連結您的視圖功能,像這樣:
from django.urls import pathfrom .views import Index
urlpatterns = [    path('', Index),]

而且還需要像這樣在主項目urls.py中包含應用程式urls.py
from django.contrib import adminfrom django.urls import path, include
urlpatterns = [ path('admin/', admin.site.urls), path('', include('MyApp.urls'))]

現在,在的模板文件夾中,需要創建兩個這樣的html文件。
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title>    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"></head><body>
<div class = "jumbotron"> {% for post in posts %}
<h1 class="display-4">{{post.title}}</h1> Published {{post.publish}} by {{post.author}}
{{post.body|truncatewords:30|linebreaks}}
<hr class="my-4">

{% endfor %}

</div>

{% include "pagination.html" with page=posts %}

</body></html>

所以這是我們的索引html文件,也可以在頂部看到我添加了Bootstrap CDN連結,因為我將使用一些bootstrap樣式進行分頁。該代碼用於包含我們尚未創建的分頁文件。
{%  include  "pagination.html"  with  page=posts  %}

由於我們傳遞給模板的Page對象稱為帖子,因此我們將分頁模板包括在帖子列表模板中,並傳遞參數以正確呈現它。可以按照此方法在不同模型的分頁視圖中重用分頁模板。

現在,這是我們的pagination.html文件。
<nav aria-label="Page navigation example" >
<ul class="pagination">
<li class="page-item">
{% if page.has_previous %} <a class="page-link" href="?page={{page.previous_page_number}}">Previous</a>
{% endif %}
</li>
<li class="page-item">
<a class="page-link">Page {{page.number}} of {{page.paginator.num_pages}}</a>
</li>

<li class="page-item">
{% if page.has_next %} <a class="page-link" href="?page={{page.next_page_number}}">Next</a>
{% endif %}
</li>

</ul>


</nav>

python manage.py runserver

2:基於類的視圖分頁
 
因此,對於基於類的視圖分頁,我們需要像這樣在views.py文件中進行一些更改。
from django.shortcuts import renderfrom .models import Postfrom django.core.paginator import Paginator, EmptyPage, PageNotAnIntegerfrom django.views.generic import ListView

'''def Index(request): post_list = Post.objects.all() paginator = Paginator(post_list, 2) page = request.GET.get('page')
try: posts = paginator.page(page) except PageNotAnInteger: posts = paginator.page(1)
except EmptyPage: posts = paginator.page(paginator.num_pages)



return render(request, 'index.html', {'page':page,'posts':posts})
'''

class PostList(ListView): queryset = Post.objects.all() context_object_name = 'posts' paginate_by = 2 template_name = 'index.html'

django.views.generic.list.ListView提供了一種內置的方法來對顯示的列表進行分頁。可以通過在視圖類中添加paginate_by屬性來實現此目的,這會限制每頁的對象數,並向上下文中添加paginator和page_obj。要允許用戶在頁面之間導航,請在模板中添加指向下一頁和上一頁的連結。
現在,在此之後,需要打開urls.py並注釋上一個視圖,並添加基於類的視圖
from django.urls import pathfrom .views import  PostList
urlpatterns = [ #path('', Index), path('', PostList.as_view())
]

可以在頂部看到我們已經導入了PostList,為了保持分頁功能,我們必須使用正確的頁面。傳遞給模板的對象。Django的ListView通用視圖將所選頁面傳遞到名為page_obj的變量中,因此必須相應地編輯index.html模板,以使用正確的變量包括分頁器,如下所示:
{% include 'pagination.html' with page=page_obj %}

因此,如果運行項目,結果跟上面截圖是一樣的。
完畢,希望這篇對大家學習有幫助。

相關焦點

  • Django實現分頁功能
    本節要講的分頁功能大家一定不陌生,就像課本上的一篇篇課文一樣,如果課文內容很多就會分成很多頁,展示給讀者。這和我們在開發階段處理數據信息是一樣的,因為大多數情況下,我們往往會面對很多的數據信息,為了讓這些信息顯示的更便於閱讀以及減小數據的提取量從而減少伺服器的壓力等,我們就會採用分頁的處理方法,Django 為開發者提供了內置的模塊 Paginator 類。
  • 一個完整的Django入門指南
    前言今天我將開始一個關於 Django 基礎知識的全新系列教程,這是一個開始學習 Django 的完整入門指南,教程材料一共會被分為七個部分。我們將從安裝、開發環境的準備,模型,視圖,模板,URL到更高級的主題(如遷移,測試和部署)中詳細探討所有基本概念。
  • 完全講解PHP+MySQL的分頁顯示示例分析
    Web開發是今後分布式程式開發的主流,通常的web開發都要涉及到與資料庫打交道,客戶端從伺服器端讀取通常都是以分頁的形式來顯示,一頁一頁的閱讀起來既方便又美觀。所以說寫分頁程序是web開發的一個重要組成部分,在這裡,我們共同來研究分頁程序的編寫。
  • 向Django Admin添加圖表
    如果我們創建一個新文件,我們可以強制django-admin去加載我們的模板來代替默認模板。瞧,我們現在已經在django後臺管理中呈現了一個Chart .js圖表。唯一的問題是數據是硬編碼的,而不是從後端派生的。
  • 最淺顯易懂的Django系列教程(1)-URL與視圖
    示例代碼如下:from django.contrib import adminfrom django.urls import pathfrom book import viewsurlpatterns = [ path('admin/', admin.site.urls), path('book/',views.book_list
  • Django基礎(24): aggregate和annotate方法使用詳解與示例
    因為這個查詢涉及到對整個queryset的age欄位進行統計計算,此時django的聚合函數方法aggregate就可以幫我們大大提升查詢效率了[見後文]。對於這個複雜查詢, django的annotate方法一句話就可以解決問題。aggregate()方法詳解aggregate的中文意思是聚合, 源於SQL的聚合函數。Django的aggregate()方法作用是對一組值(比如queryset的某個欄位)進行統計計算,並以字典(Dict)格式返回統計計算結果。
  • Python——用 Django 寫 restful api 接口
    models.py (https://code.ziqiangxuetang.com/django/django-models.html)—— 與資料庫操作相關,存入或讀取數據時用到這個,當然用不到資料庫的時候 你可以不使用。
  • Django Form表單API詳解
    實例如下所示:In [1]: from django import forms ...: class LoginForm(forms.Form): ...: title=forms.CharField(label="書名") ...
  • web開發中PHP+MySQL分頁顯示示例分析
    Web開發是今後分布式程式開發的主流,通常的web開發都要涉及到與資料庫打交道,客戶端從伺服器端讀取通常都是以分頁的形式來顯示,一頁一頁的閱讀起來既方便又美觀。所以說寫分頁程序是web開發的一個重要組成部分,在這裡,我們共同來研究分頁程序的編寫。
  • Django Form表單完整使用流程
    編寫如下代碼定義 Form 表單欄位:from django import formsclass TitleSearch(forms.Form): title=forms.CharField(label='書名',label_suffix='',error_messages={'required':'請輸入正確的title'})
  • 一篇文章帶你了解Django ORM操作(高端篇)
    示例:查詢出版社出版的書大於2本的數據。示例:查詢book表,評論數小於收藏數的數據。示例:查詢title = "<<大明帝國>>" or title != "<<安史之亂>>"。
  • 10道題教你使用python Django框架來實現web應用,值得收藏
    關於django升級:django1.5開始支持python3。同時django1.11是支持python2的最後的版本。如果使用的django版本大於等於1.5,則django版本可以不升級。如果django版本低於1.5,則需要升級django版本。升級django版本後,新版本不兼容的老的API都需要修改。這個工作量比較大。
  • python程式設計師嘔心瀝血整理 Django 優秀資源大全
    django-allauth, star:3000 - 一套完整的 Django 應用,解決認證,註冊,帳戶管理及第三方(社交)帳戶認證。django-organizations, star:338 - Django 項目的多用戶帳戶功能。
  • Python+django網頁設計入門(12):使用Bootstrap和jQuery
    前導課程:Python+django網頁設計入門(11):在線考試與自動評分Python+django網頁設計入門(10):分頁顯示Python+django網頁設計入門(9):自定義反爬蟲功能Python+django網頁設計入門(8):網站項目文件夾布局Python+django網頁設計入門
  • Django基礎(10): URL重定向的HttpResponseDirect, redirect和reverse的用法詳解
    這個URL可以是完整的連結(比如』http://www.baidu.com『),也可以是一個不包含域名的靜態連結(例如『/index/』)。我們下面以新聞博客(blog)為例來看看如何使用HttpResponseDirect方法。假如我們有如下3個urls, 一個展示文章,一個添加文章,一個展示文章詳情。
  • Django查詢資料庫操作詳解(一)
    示例如下:#使用 Django shellAuthor.objects.create(name="Tom",email="456789@163.com") #添加 Tom 此時數據表有兩個TomAuthor.objects.get(name="Tom") #查詢 name="Tom",就會報錯#報錯信息如下MultipleObjectsReturned
  • 2020年最新Django經典面試問題與答案匯總(中)-大江狗整理
    django的aggregate方法支持的聚合操作有AVG / COUNT / MAX / MIN /SUM 等。Hobby.objects.filter(name__startswith="d").annotate(student_num=Count('student『))更多閱讀Django基礎(24): aggregate和annotate方法使用詳解與示例16. Django中如何使用redis做緩存?
  • Django 1.10中文文檔-聚合
    速查表QuerySet 聚合QuerySet 逐個對象的聚合Join 和聚合聚合 QuerySet 子句 Django 1.10 中文文檔: https://github.com/jhao104/django-chinese-docDjango 資料庫抽象API 描述了使用 Django
  • 8個能提高Django開發效率的Python包
    12要素app設置:django-environDjango-environ允許您使用12要素應用程式方法來管理Django項目中的設置。它會收集其他的庫,包括envparse和honcho。安裝完django- environment之後,將在項目的根目錄中創建一個.env文件。
  • Django第二十八課
    這裡大概有兩種方法:一是繼承django的用戶模型;二是使用新的模型拓展關聯User(🌟🌟🌟🌟🌟)。1. 繼承Django的用戶模型我們之前使用的User是在django.contrib.auth.models中引用的,我們可以查看這部分源碼,分析這個User是如何創建的。