若何利用django自帶的分頁器(Paginator),本篇文章本家兒要環繞分頁器,具體論述實現分頁器功能。
這里我利用的是py3和django2.0版本!
from django.db import models
class Blog(models.Model):
title = models.CharField(max_length=50) # 題目 限制50字
content = models.TextField() # 文章內容
def __str__(self):
return self.title
class Meta: # 自界說排序
ordering = ['-id']
這里我在blog這個app下的models.py里面界說了一個Blog,CharField 字符串字段,用于較短的字符串,利用它時必需增添限制 max_length,TextField 字符串字段,可以保留年夜量文本。
模子點竄完跋文得先利用python manage.py makemigrations,然后再用
python manage.py migrate
def home(request):
context = {}
context['blogs'] = Blog.objects.all() # 獲取全數文章
return render(request, "home.html", context)
from django.contrib import admin
from django.urls import path
from blog import views
#127.0.0.1:8000
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.home, name='home'),
]
django網頁的默認打開網址是127.0.0.1:8000,當我們打開網址時,響應的就會由第二條path去執行,然后由views視圖去響應這個請求
若是我們手動在后臺建立一個個文章,顯然是很慢的,是以我們可以利用shell來為我們快速生當作文章數據。起首在cmd號令模式下輸入python manage.py shell,接著輸入以下代碼就能建立出31篇文章了!
from blog.models import Blog
for x in range(1,32):
blog = Blog()
blog.title = "第%s篇文章" %(x)
blog.content = "第%s篇內容" %(x)
blog.save()
Blog.objects.all() # 看看是否生當作了文章
在APP目次下建立templates文件夾,并在該文件夾里建立一個home.html文件,接著添加內容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
{% for blog in blogs %}
<p>{{ blog.title }}</p>
<p>{{ blog.content }}</p>
<hr>
{% endfor%}
</body>
</html>
接著python manage.py runserver之后打開網址127.0.0.1:8000,你會看到頁面呈現31篇文章,若是文章篇數過多,會導致網頁加載遲緩甚至卡死,并且十分不美不雅,是以我們就想到利用分頁器來解決這個問題。
在views.py添加代碼
from django.shortcuts import render
from blog.models import Blog
from django.core.paginator import Paginator
def home(request):
context = {}
blogs = Blog.objects.all()
paginator = Paginator(blogs, 5) # 每5份內容分頁一次
page_num = request.GET.get('page',1) # 獲取url參數,127.0.0.1:8000/?page=<value>
# 不法數值則返回1 數值為空也返回1 如 127.0.0.1:8000/?page=asdsa
page_blogs = paginator.get_page(page_num) #獲取當前(頁碼)所需要的文章列表 半斤八兩于一個容器
context['blogs'] = page_blogs
return render(request, "home.html", context)
這里我們利用了django的Paginator,
用法:Paginator(數據列表,每頁中含幾多數據)
之后,我們再次打開網頁127.0.0.1:8000,會發現頁面只顯示了10篇文章!我們在網址上輸入http://127.0.0.1:8000/?page=2,當作功了!
這里為了結果加倍較著,我點竄了paginator = Paginator(blogs, 2),每一頁中只含兩篇文章!
from django.shortcuts import render
from blog.models import Blog
from django.core.paginator import Paginator
def home(request):
context = {}
blogs = Blog.objects.all()
paginator = Paginator(blogs, 2) # 每2份內容分頁一次
page_num = request.GET.get('page',1) # 獲取url參數,127.0.0.1:8000/?page=<value>
# 不法數值則返回1 數值為空也返回1 如 127.0.0.1:8000/?page=asdsa
page_blogs = paginator.get_page(page_num) #獲取當前(頁碼)所需要的文章列表 半斤八兩于一個容器
page_list = [x for x in range(page_blogs.number -2, page_blogs.number + 3 )if x in paginator.page_range]
print(page_list)
# 添加省略號
if page_list[0] -1 >= 2: # 判定當前第一個元素減1是否年夜于2
page_list.insert(0, "...") # 則插入該數構成為第一個元素 ...
if paginator.num_pages - page_list[-1] >= 2: # 判定最年夜頁碼數-最后一個元素相減是否年夜于2
page_list.append("...") # 則添加一個元素
print(page_list)
#添加首從頭至尾頁
if page_list[0] == "...":
page_list.insert(0, 1) # 則插入該數構成為第一個元素(首頁)
if page_list[-1] != paginator.num_pages: # 判定是否不等于最年夜頁碼
page_list.append(paginator.num_pages) # 不等于則插入到最后一個元素(從頭至尾頁)
print(page_list)
context['blogs'] = page_blogs
context['page_list'] = page_list
return render(request, "home.html", context)
# paginator.num_pages 總共有幾多頁碼
# paginator.page_range 頁碼規模 如 (1,7)
# page_list 頁碼列表規模
這里的
page_list = [x for x in range(page_of_blogs.number -2, page_of_blogs.number + 3 )if x in paginator.page_range]
我利用了列表生當作式,如許可以避免超出頁碼規模或呈現頁碼數為負數的環境,別的我把page_list頁碼列表規模傳出去,如許就可以在模板中利用了!別的添加了首從頭至尾頁以及省略號!之后就是在模板中利用了!
這里我利用的是bootstrap的分頁組件!在head頭部記得引入css!
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div>
{% for blog in blogs %}
<p>{{ blog.title }}</p>
<p>{{ blog.content }}</p>
<hr>
{% endfor%}
</div>
<div>
<ul>
<li>
{% if blog_list.has_previous %}{# 是否上一頁 #}
<a href="?page={{ blog_list }}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
{% else %}
<span aria-hidden="true">«</span>
{% endif%}
</li>
{# 全數頁碼 #}
{% for page_list in page_list %}
{% if page_list == blogs.number %}{# 判定是否當前頁 是則高亮 #}
<li><span>{{ page_list }}</span></li>
{% else %}
{% if page_list == '...' %}
<li><span>{{ page_list }}</span></li>
{% else %}
<li><a href="?page={{ page_list }}">{{ page_list }}</a></li>
{% endif %}
{% endif %}
{% endfor %}
<li>
{% if page_list.has_next %}
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
{% else %}
<span aria-hidden="true">»</span>
{% endif %}
</li>
</ul>
</div>
</body>
</html>
context['blogs'] = page_blogs
context['page_list'] = page_list
page_list.has_previous 是否有上一頁
page_list.has_next 是否有下一頁
blogs.number 當前頁碼數 半斤八兩于-> page_blogs.number
這里我利用了django的模板,for輪回,前提if,一般都用{% 前提 %},變量則利用{{ 變量名 }},
若是想要讓分頁器在網頁上居中,可以在div標簽上添加:
<div align="center"></div>即可實現居中結果
最終結果:
0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!