読者です 読者をやめる 読者になる 読者になる

牌語備忘録 -pygo

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

牌語備忘録 -pygo

Djangoでページネーションをざっとやってみた

Django Python


(MacOSX10.7, Python2.7, Django1.3)

テスト用のプロジェクト作成や設定とか

django-admin.py startproject paginate
cd paginate
python manage.py startapp pagination
cd pagination
ls
__init__.py  models.py  tests.py  views.py
setting.py
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'sqlite3.db', 
:
    }
}
:
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates'),
)
:
INSTALLED_APPS = (
:
    'pagination',
)
urls.py
from django.conf.urls.defaults import patterns, include, url

urlpatterns = patterns('',
                           url(r'^$', 'paginate.pagination.views.index'),
)

models.py

from django.db import models


class Entry(models.Model):
    title = models.CharField(max_length=200)

    def __unicode__(self):
        return self.title

views.py

from django.shortcuts import render_to_response
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from paginate.pagination.models import Entry


def index(request):
    entry = Entry.objects.all()
    paginator = Paginator(entry, 10)

    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    try:
        fp = paginator.page(page)
    except (EmptyPage, InvalidPage):
        fp = paginator.page(paginator.num_pages)

    return render_to_response('pagination/index.html', {'entry': fp})

index.html

ディレクトリを作成してindex.htmlファイルを作る

  • /templates/pagination/index.html
{% for data in entry.object_list %}
{{ data.title }} <br />
{% endfor %}

<br />

<span>
  {% if entry.has_previous %}
  {% ifnotequal previous_page_number 1 %}
  <a href="?page=1">First</a>
  {% endifnotequal %}
  {% endif %}
  
  {% if entry.has_previous %}
  <a href="?page={{ entry.previous_page_number }}">Previous</a>
  {% endif %}
  
  {% for num in entry.paginator.page_range %}
  {% ifequal num entry.number %}
  <span class="current page">{{ num }}</span>
  {% else %}
  <a href="?page={{ num }}"> {{ num }}</a>
  {% endifequal %}
  {% endfor %}
  
  {% if entry.has_next %}
  <a href="?page={{ entry.next_page_number }}"> Next </a>
  {% endif %}

  {% if entry.has_next %}
  {% ifnotequal next_page_number entry.paginator.num_pages %}
  <a href="?page={{ entry.paginator.num_pages }}">Last</a>
  {% endifnotequal %}    
  {% endif %}    
</span>

動作確認

syncdb
python manage.py syncdb
テストデータ作成
python manage.py shell
>>> from paginate.pagination.models import Entry
>>> Entry.objects.all() #-> []
>>> for i in range(100):
...    Entry(title="title:{0:08d}".format(i)).save()
>>> Entry.objects.all() #-> [<Entry: titel00000000>, <Entry: titel00000001>,  ...
runserver
python manage.py runserver
webブラウザで確認

メモ

  • プロジェクト名、アプリ名をもっと分かりやすいものでやればよかった(´・ω・`)