黒猫のWeb的開発

Webやスマートフォンアプリ開発未経験者が何かを勉強して作っていくためのメモです。

Djangoでページ表示

Djangoのデータベースに登録した内容を一覧表示する際に、ページに分けて1ページ毎20件表示したい。

http://localhost/date/?page=1
のようにpageの後の番号を変えて表示する。

Djangoにはページネータという機能があるため、利用することにする。
http://docs.djangoproject.jp/en/latest/topics/pagination.html

使い方は、オブジェクトのリストをPaginatorというクラスに突っ込むだけみたい。
Djangoは、マニュアルが丁寧だから分かりやすい。

view.pyはこんな感じかな。
Blogはお気に入りのブログをまとめたオブジェクト
urls.pyで表示するページを判断するのではなく、getでpageの値を指定する。

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

....

# 更新ページの表示
def update(request):
    blogs = Blog.objects.all().order_by("-update")
    paginator = Paginator(blogs, 20)
    page = request.GET.get('page')
    try:
        blogs = paginator.page(page)
    except PageNotAnInteger:
        # ページの指定がおかしい場合は、1ページ目の要素を取得
        blogs = paginator.page(1)
    except EmptyPage:
        # 指定されたページの要素を取得
        blogs = paginator.page(paginator.num_pages)
    ret = render_to_response('update.html',
            {'blogs': blogs}, RequestContext(request))
    return ret
<!-- ページ表示 -->    
    <div class="pagination">
	    <span class="step-links">
	        {% if blogs.has_previous %}
	            <a href="?page={{ blogs.previous_page_number }}">previous</a>
	        {% endif %}
	
	        <span class="current">
	            Page {{ blogs.number }} of {{ blogs.paginator.num_pages }}.
	        </span>
	
	        {% if blogs.has_next %}
	            <a href="?page={{ blogs.next_page_number }}">next</a>
	        {% endif %}
	    </span>
	</div>    

好きな猫ブログをまとめたページに反映してみた。
http://bcde.jp/nekoblog/update/?page=1

1時間あればありがちな機能はさくっと追加できるフレームワークはすばらしい・・・
もうちょっとページ表示のデザインは変更した方がいいかな。