Published Date : 2019年3月28日0:35
from django.core.paginator import Paginator
from django.db import models
class Post(models.Model):
title=models.CharField(max_length=100)
published=models.DateTimeField()
image = models.ImageField(upload_to='media/')
body = models.TextField()
この設計図をもとに作られたデータを
データベースから取り出すと、
posts=Post.objects.all()
print(posts)
->
[
{'id':1,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'},
{'id':2,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'},
{'id':3,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'}
]
p = Paginator(posts, 2)

p.count -> 3
p.num_pages -> 2
p.page_range -> range(1, 3)
p.page_range
-> range(1, 3)
for page in p.page_range:
-> for page in range(1,3):
print(page)
-> 1
-> 2
page1 = p.page(1) page1 -> ページ 2個 あるうちの 1個目
page1.object_list
-> [
{'id':1,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'},
{'id':2,'published':'記事の投稿時間','title':'記事のタイトル','body':'記事の本文'}
]
page1.has_next() -> True
page1.has_previous() -> False
page2 = p.page(2)
page2.has_other_pages() -> True次のページの番号は? エラーが返される。
page2.next_page_number() -> Traceback (most recent call last): ... EmptyPage: That page contains no results
page2.previous_page_number() -> 1
page1.start_index() -> 1
page2.start_index() -> 3
page2.end_index() -> 3






from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
posts=Post.objects.all() paginator = Paginator(posts, 1)
try:
page = paginator.page(post_id)
except PageNotAnInteger:
page = paginator.page(1)
except EmptyPage:
page = paginator.page(paginator.num_pages)
return render(request,'posts/post.html',{'post':post,'post_body':post_body,'page':page})


{% include 'posts/pagination.html' %}

<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
<li class="page-item disabled">
<a class="page-link" href="#" tabindex="-1">Previous</a>
</li>
<li class="page-item"><a class="page-link" href="#">1</a></li>
<li class="page-item"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="#">3</a></li>
<li class="page-item">
<a class="page-link" href="#">Next</a>
</li>
</ul>
</nav>
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
{% if page.has_previous %}
<li class="page-item"><a class="page-link"
href="{{ page.previous_page_number }}>前へ</a></li>
{% else %}
<li class="page-item disabled"><span></span></li>
{% endif %}
</ul>
</nav>
{% if page.has_previous %}
href="{{ page.previous_page_number }}"
http://あなたのドメイン名/posts/ページ番号
href="{% url 'post' post.id %}"
{% else %}
<li class="page-item disabled"><span></span></li>
page-item disabled page-item active
{% endif %}
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
{% if page.has_previous %}
<li class="page-item"><a class="page-link"
href="{{ page.previous_page_number }}>前へ</a></li>
{% else %}
<li class="page-item disabled"><span></span></li>
{% endif %}
どんどん付け足していこう。
{% for i in page.paginator.page_range %}
{% if page.number == i %}
<li class="page-item active">
<span class="page-link">{{ i }}
<span class="sr-only">(current)
</span></span></li>
{% else %}
<li class="page-item">
<a class="page-link"
href="{{ i }}">{{ i }}</a></li>
{% endif %}
{% endfor %}
</ul>
</nav>
{% for i in page.paginator.page_range %}
{% if page.number == i %}
{% else %}
{% endif %}
{% endfor %}
{% if page.number == i %}
アクティブにして、
現在表示中のページ番号だとわかるようにする。
<li class="page-item active">
<span class="page-link">{{ i }}
<span class="sr-only">(current)
</span></span></li>
sr-onlyは、Screen Reader Only の略。
簡単に雑に話すと、
目が不自由な方々への配慮です。
音声ソフト(スクリーンリーダー)が
このページネーションの場所は(current)だよ
と音声で読み上げてくれる。
画面上からは見えない。
もしそうでないなら
{% else %}
ページ番号を表示。
<li class="page-item">
<a class="page-link"
href="{{ i }}">{{ i }}</a></li>
リンク先も番号(記事のID番号と同じ)にする。
IF文終了
{% endif %}
FOR文終了
{% endfor %}
もし、次のページがあるなら、
{% if page.has_next %}
次のページのリンク先をつけて「次へ」を表示。
<li class="page-item">
<a class="page-link"
href="{{ page.next_page_number }}">次へ</a></li>
そうではないなら、
{% else %}
空っぽの表示。
<li class="page-item disabled">
<span></span></li>
IF文終了。
{% endif %}
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
前への処理。
{% if page.has_previous %}
<li class="page-item"><a class="page-link"
href="{{ page.previous_page_number }}>前へ</a></li>
{% else %}
<li class="page-item disabled"><span></span></li>
{% endif %}
ページの番号表示とリンクへ飛ばす処理。
{% for i in page.paginator.page_range %}
{% if page.number == i %}
<li class="page-item active">
<span class="page-link">{{ i }}
<span class="sr-only">(current)
</span></span></li>
{% else %}
<li class="page-item">
<a class="page-link"
href="{{ i }}">{{ i }}</a></li>
{% endif %}
{% endfor %}
次への処理。
{% if page.has_next %}
<li class="page-item">
<a class="page-link"
href="{{ page.next_page_number }}">次へ</a></li>
{% else %}
<li class="page-item disabled">
<span></span></li>
{% endif %}
</ul>
</nav>
python manage.py runserver
localhost:8000/posts



