見出し画像

[Lightsail Django]No13 Listviewとページャーを使う

DjangoのListviewは、少ないコード量で対象テーブルのレコードを取得し画面に表示させることができます。またページャー機能も搭載されています。

前提

プロジェクト名:TEST
アプリ名:APP_TEST

/opt/bitnami/projects/[プロジェクト名]/[アプリ名]/
/opt/bitnami/projects/TEST/APP_TEST/

1.listviewの基本的な使い方

1-1.views.py

vim /opt/bitnami/projects/TEST/APP_TEST/views.py
from django.http import HttpResponse
from django.http import Http404
from django.shortcuts import render, redirect
from django.template import loader
from .models import Blog

from .forms import BlogForm
import logging

from django.views.generic import ListView

from django.core.paginator import Paginator

# Create your views here.

# ListViewを継承する
class List(ListView):

    # 表示させたいモデルを設定する
    model = Blog

    # order byを設定する
    # フィールド名の前に「-」を付けることで降順ソート
    ordering = '-blogid' 

    # htmlでモデルデータを参照するようの変数名を定義する
    # 未設定の場合は、変数名object_listとなる
    # context_object_name = "blog_list"

    # テンプレートhtmlを指定する
    template_name = "list.html"

    # 1ページに何レコード表示するか?
    paginate_by = 5

メモ:ordering(order by)をつけないとエラーとなる

/opt/bitnami/python/lib/python3.11/site-packages/django/views/generic/list.py:91: 
UnorderedObjectListWarning: Pagination may yield inconsistent results 
with an unordered object_list: <class 'APP_TEST.models.Blog'> QuerySet.


1-2.urls.py

vim /opt/bitnami/projects/TEST/APP_TEST/urls.py
from django.urls import path

from . import views

app_name = 'APP_TEST'

urlpatterns = [

        # 今回のviewsはclassをURLマッピングさせるので、as_view()をつける
        path("list/", views.List.as_view(), name='list'),
        ]

        path("edit/<int:blogid>/", views.detail, name="detail"),


1-3.テンプレートhtml

vim /opt/bitnami/projects/TEST/APP_TEST/templates/list.html
<div>
    <!-- デフォルトでは、モデルのデータ変数は、object_list -->
    {% for item in object_list %}

    <div>
         <!-- get_absolute_urlについては以下参照-->
         <a href="{{ item.get_absolute_url }}">{{ item.title }}</a>
    </div>
    {% endfor %}
</div>

1-4.モデル

from django.db import models
from django.urls import reverse
from django.urls import reverse_lazy 


# Create your models here.
class Blog(models.Model):

        blogid = models.IntegerField(primary_key=True)
        title = models.CharField(max_length=100)
        text = models.CharField(max_length=1000)

        def __str__(self):
                return self.title

        # htmlからURLを取得できるようにする
        # reverseメソッドはURLを生成するようなイメージで、
        # urls.pyに設定されたnameを指定する
        # kwargsで、key,valueの感じでパラメータ指定できる
        #
        # urls.pyの以下定義のURLにマッピングさせる
        # path("edit/<int:blogid>/", views.detail, name="detail"),

        def get_absolute_url(self):
                return reverse('APP_TEST:detail', kwargs={'blogid' : self.pk} )
 

1-5.画面表示

2.ページャー

ページャーは上記の設定のみで使用できるようになります。
デフォルトで用意されているpage_obj変数を使用しページャーを組み立てて行きます。

2-1.テンプレートhtml

vim /opt/bitnami/projects/TEST/APP_TEST/templates/list.html
<div>
    <!-- page_obj.number:現在のページNo -->
    <!-- page_obj.paginator.num_pages:トータルのページ数 -->
    Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
</div>
<div>

    <!-- page_obj.has_previous:前のページがあるか?-->
    {% if page_obj.has_previous %}

        <!-- page_obj.previous_page_number:前のページのページNo-->
        <a href="?page={{page_obj.previous_page_number}}>前のページ</a>

    {% else %}
        前のページ
    {% endif %}
    |

    <!-- page_obj.has_next:次のページがあるか?-->
    {% if page_obj.has_next %}

        <!-- page_obj.next_page_number:前のページのページNo-->
        <a href="?page={{page_obj.next_page_number}}">次のページ</a>

    {% else %}
        次のページ
    {% endif %}

</div>

2-2.画面表示

その他

その他、amazon LightsailにてDjangoを使用したWEBアプリ構築については以下となります。(こちらの記事は以下記事の続きとなります。)




この記事が気に入ったらサポートをしてみませんか?