🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

2116閲覧

Django ページング機能の追加方法

minari766

総合スコア17

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/01/07 16:36

編集2021/01/07 16:39

###前提
Python3.8.3、Django2.2.16でブログアプリを作成しております。

###実現したいこと
ページング参考サイト
上記参考サイトを元にページング機能を追加を追加したいと考えております。

一度ページング機能だけのアプリを作成して上手くいったので、元々作っていたブログアプリに適用させたのですがページング機能らしきものが表示されずエラーも出てきません。

お手数ですがコードの誤りをご指摘いただきたくお願い致します。
(参考サイトではListView等の汎用ビューを使っているものの、ブログアプリでは内容理解のため敢えて汎用ビューをViewのみに限定しております。そこに問題があるのではと予想しているのですが・・・)

###コード
最低限のコードを記載したつもりです。必要以上に削ってしまっていたら恐縮です。
urls.py

python

1from django.urls import path 2from app import views 3 4urlpatterns = [ 5 path('', views.IndexView.as_view(), name='index'), 6 path('post/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'), 7 path('post/new/', views.CreatePostView.as_view(), name='post_new'), 8 path('post/<int:pk>/edit/', views.PostEditView.as_view(), name='post_edit'), 9 path('category/<str:category>/', views.CategoryView.as_view(), name='category'), 10 path('category/<str:category>/', views.CategoryNameView.as_view(), name='category_name'),

views.py

python

1from django.views.generic import View 2from django.views.generic.list import MultipleObjectMixin 3from django.shortcuts import render,redirect 4from .models import Post 5from .forms import PostForm 6from django.contrib.auth.mixins import LoginRequiredMixin 7 8class IndexView(View, MultipleObjectMixin): 9 def get(self, request, *args, **kwargs): 10 post_data = Post.objects.order_by("-id") 11 paginate_by = 4 12 return render(request, 'app/index.html', { 13 'post_data': post_data, 14 }) 15 16class PostDetailView(View): 17 def get(self, request, *args, **kwargs): 18 post_data = Post.objects.get(id=self.kwargs['pk']) 19 return render(request, 'app/post_detail.html', { 20 'post_data': post_data 21 }) 22 23class CreatePostView(LoginRequiredMixin, View): 24 def get(self, request, *args, **kwargs): 25 form = PostForm(request.POST or None) 26 return render(request, 'app/post_form.html', { 27 'form': form 28 }) 29 30 def post(self, request, *args, **kwargs): 31 form = PostForm(request.POST or None) 32 33 if form.is_valid(): 34 post_data = Post() 35 post_data.author = request.user 36 post_data.title = form.cleaned_data['title'] 37 category = form.cleaned_data['category'] 38 post_data.category = Category.objects.get(name=category) 39 post_data.content = form.cleaned_data['content'] 40 if request.FILES: 41 post_data.image = request.FILES.get('image') 42 return render(request, 'app/post_preview.html', { 43 'post_data' : post_data 44 }) 45 46 return render(request, 'app/post_form.html', { 47 'form': form 48 }) 49 50class PostEditView(LoginRequiredMixin, View): 51 def get(self, request, *args, **kwargs): 52 post_data = Post.objects.get(id=self.kwargs['pk']) 53 form = PostForm( 54 request.POST or None, 55 initial={ 56 'title': post_data.title, 57 'category': post_data.category, 58 'content': post_data.content, 59 'image': post_data.image, 60 } 61 ) 62 63 return render(request, 'app/post_form.html', { 64 'form': form 65 }) 66 67 def post(self, request, *args, **kwargs): 68 form = PostForm(request.POST or None) 69 70 if form.is_valid(): 71 post_data = Post.objects.get(id=self.kwargs['pk']) 72 post_data.title = form.cleaned_data['title'] 73 category = form.cleaned_data['category'] 74 category_data = Category.objects.get(name=category) 75 post_data.category = category_data 76 post_data.content = form.cleaned_data['content'] 77 if request.FILES: 78 post_data.image = request.FILES.get('image') 79 post_data.save() 80 return redirect('post_detail', self.kwargs['pk']) 81 82 return render(request, 'app/post_form.html', { 83 'form': form 84 }) 85 86 87class CategoryNameView(View): 88 def get(self, request, *args, **kwargs): 89 category_data = Category.objects.get(name=self.kwargs['category']) 90 post_data = Post.objects.filter(category=category_data) 91 return render(request, 'app/index.html', { 92 'post_data' : post_data 93 })

models.py

python

1from django.conf import settings 2from django.db import models 3from django.utils import timezone 4 5class Category(models.Model): 6 name = models.CharField("カテゴリ", max_length=100) 7 8 def __str__(self): 9 return self.name 10class Post(models.Model): 11 author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 12 category = models.ForeignKey(Category, verbose_name='カテゴリ', on_delete=models.CASCADE) 13 title = models.CharField("タイトル", max_length=200) 14 image = models.ImageField(upload_to='images', verbose_name='Image画像', null=True, blank=True) 15 content = models.TextField("本文") 16 created = models.DateTimeField("作成日", default=timezone.now) 17 18 def __str__(self): 19 return self.title

index.html

html

1{% extends "app/base.html" %} 2{% load static %} 3 4{% block content %} 5<header class="masthead"> 6 <div class="container h-100"> 7 <div class="row h-100 align-items-center"> 8 <div class="col-12 text-center TDL-table"> 9 <img src="{% static 'img/TDL.png' %}" alt=""> 10 </div> 11 </div> 12 </div> 13</header> 14 15<div class="row my-4"> 16 17</div> 18 19{% for post in post_data %} 20<div class="row"> 21 <div class="col-md-4"> 22 <a href="#"> 23 {% if post.image %} 24 <img class="img-fluid rounded mb-3 mb-md-0" src="{{ post.image.url }}" alt=""> 25 {% endif %} 26 </a> 27 </div> 28 <div class="col-md-8"> 29 <div class="author-created"> 30 <h7 class="text_left">{{ post.author }}</h7> 31 <h7 class="text_right">{{ post.created }}</h7> 32 </div> 33 <h3>{{ post.title }}</h3> 34 <p>{{ post.content|truncatechars:100 }}</p> 35 <a style="float:right;" href="{% url 'post_detail' post.id %}">続きを読む</a> 36 </div> 37</div> 38<hr> 39{% endfor %} 40<div class="text-right"> 41 {% include "app/snippets/posts.html" %} 42 {% include "app/pagination.html" %} 43 <a href="{% url 'post_new' %}" class="btn btn-info">新しい記事を投稿</a> 44</div> 45{% endblock %} 46

pagination.html

html

1{% if is_paginated %} 2<nav aria-label="Page navigation"> 3 <ul class="pagination justify-content-center"> 4 {% if page_obj.has_previous %} 5 <li class="page-item"> 6 <a href="?page={{ page_obj.previous_page_number }}" class="page-link" aria-label="Previous"> 7 <span aria-hidden="true">&laquo;</span> 8 <span class="sr-only">Previous</span> 9 </a> 10 </li> 11 {% endif %} 12 {% for num in paginator.page_range %} 13 {% if page_obj.number == num %} 14 <li class="page-item active"> 15 <span class="page-link"> 16 {{ num }} 17 <span class="sr-only">(current)</span> 18 </span> 19 </li> 20 {% else %} 21 <li class="page-item"> 22 <a href="?page={{ num }}" class="page-link">{{ num }}</a> 23 </li> 24 {% endif %} 25 {% endfor %} 26 {% if page_obj.has_next %} 27 <li class="page-item"> 28 <a class="page-link" href="?page={{ page_obj.next_page_number }}" aria-label="Next"> 29 <span aria-hidden="true">&raquo;</span> 30 <span class="sr-only">Next</span> 31 </a> 32 </li> 33 {% endif %} 34 </ul> 35</nav> 36{% endif %}

snippets/posts.html

html

1{% for post in object_list %} 2<div class="card mb-3"> 3 <h5 class="card-header"> 4 <a href="{{ post.get_absolute_url }}">{{ post.title }}</a> 5 </h5> 6 <div class="card-body"> 7 {{ post.content }} 8 </div> 9</div> 10{% endfor %}

###試したこと
ページング機能追加のためにブログサイトに追記したコードは以下の通りです。

views.py
IndexViewクラス内にMultipleObjectMixinとpaginate_by=4を追加

pagination.htmlとsnippets/posts.htmlの追加

Index.html
{% include "app/snippets/posts.html" %}と{% include "app/pagination.html" %}を追加

この辺りの位置を変更したりしたのですが解決には至らずでした。

以上、お手数ですがよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

解決しました!
Viewを使いたければ、ページネーションに関する関数ベースビューをViewに入れれば良い!

投稿2021/01/10 06:29

minari766

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問