牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

Django のページネイトを使い回しできそうな感じにしてみるメモ

(python2.7, django1.5)

pipにあるパッケージとか使わずに何とかしてみたい。

View

paginate.py

新規作成する。
とりあえず settings.py とかあるディレクトリに置く

  • apps/paginate.py
#!/usr/bin/env python
# *-# -*- coding: utf-8 -*-
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def paginate(request, queryset, per_page_num):
    paginator = Paginator(queryset, per_page_num)
    page = request.GET.get('page')
    try:
        page_objects = paginator.page(page)
    except PageNotAnInteger:
        page_objects = paginator.page(1)
    except EmptyPage:
        page_objects = paginator.paginator(paginator.num_pages)
    return page_objects
利用するアプリのviews.pyに書く

for example

  • says/views.py

2ヵ所いじる感じ

from django.shortcuts import render_to_response

from says.models import Say
from apps.paginate import paginate #<- ここ

def index(request):
    says = Say.objects.all()

    return render_to_response(
        'says/index.html', {
            'says': paginate(request, says, 10),  #<- ここ
        })

Template

共用するページネイトの表示

新規作成する。

  • templates/paginate.html
<div class="paginate">
    {% if page_objects.has_previous %}
    <span><a href="?page={{ page_objects.previous_page_number }}">previous</a></span>
    {% endif %}

    {% for page_num in page_objects.paginator.page_range %}
    {% if page_objects.number == page_num %}
    <span>{{ page_num }}</span>
    {% else %}
    <span><a href="?page={{ page_num }}">{{ page_num }}</a></span>
    {% endif %}
    {% endfor %}

    {% if page_objects.has_next %}
    <span><a href="?page={{ page_objects.next_page_number }}">next</a></span>
    {% endif %}
</div>
利用するページにincludeタグをいれる

for exsample

  • templates/says/index.html
<ul>
    {% for say in says %}
    <li>{{ say.message }}</li>
    {% endfor %}
</ul>

{% include "paginate.html" with page_objects=says %}

表示例