実現したいこと
Djangoで日記アプリケーションを作成しています。マイページ上でプロフィールだけでなく、自分が投稿した記事の一覧を併せて表示させており、表示させる記事の数を最大6にして、それ以降はページネーションによって記事を分割表示しようとしています。
前提
モデル
・主モデルCustomUserに対して、従モデルArticleが一対多でリレーションシップ関係を取っています
・Articleモデルのリレーションフィールド(post_user)では、下記サイトを参考に、テンプレート側で逆参照を出来るように、related_nameオプションを設定しています
https://qiita.com/ragnar1904/items/1afaeb6601cc490fb70a#%E9%80%86%E5%8F%82%E7%85%A7%E3%81%AE%E5%A0%B4%E5%90%88
models.py
1class CustomUser(AbstractUser): 2 username = models.CharField( 3 _("username"), 4 max_length=30, 5 help_text='Required 30 characters or fewer.', 6 unique=True, 7 error_messages={ 8 'unique': _("This Username already exists."), 9 },) 10 11 email = models.EmailField( 12 _('email'), 13 unique=True, 14 error_messages={ 15 'unique': _("A user with that email address already exists."), 16 },) 17 18 class Meta: 19 verbose_name_plural = 'CustomUser' 20 21 22class Article(models.Model): 23 post_user = models.ForeignKey(CustomUser, verbose_name='Post User', on_delete=models.CASCADE, related_name='name',) 24 title = models.TextField(verbose_name='title', max_length=50,) 25 content = MDTextField() 26 thumbnail = models.ImageField(verbose_name='thumbnail', null=False, blank=False,)
ビュー
・ビューではListViewを継承し、クラス変数model
にはCustomUserを指定し、クラス変数paginate_by
の指定も行う
・get_queryset()のオーバーライドでは、マイページのユーザに紐づくArticleモデルのクエリーセットをテンプレートへ渡すようにする
views.py
1class MyPageView(LoginRequiredMixin, generic.ListView): 2 template_name = 'mypage.html' 3 model = CustomUser 4 paginate_by = 6 5 6 def get_queryset(self): 7 articles = CustomUser.objects.filter(username=self.request.user).prefetch_related('name') 8 return articles
テンプレート
・テンプレートでは、主テーブルCustomUserのクエリを{% for s in customuser_list %}
で取り出し、従テーブルArticleのクエリを{% for article in s.name.all %}
で取り出す。
mypage.html
1{% for s in customuser_list %} 2<section class="u-content-space"> 3 <div class="container"> 4 <header class="text-center w-md-50 mx-auto mb-8"> 5 <h2 class="h1">Prototyping Works by {{ s.username }}</h2> 6 </header> 7 8 <div class="js-shuffle u-portfolio row no-gutters mb-6"> 9 {% for article in s.name.all %} 10 <figure class="col-sm-6 col-md-4 u-portfolio__item" data-groups='["its-illustration"]'> 11 <img class="u-portfolio__image_original" src="{{ article.thumbnail.url }}" alt="Image Description"> 12 <figcaption class="u-portfolio__info"> 13 <h6 class="mb-0">{{ article.title }}</h6> 14 </figcaption> 15 </figure> 16 {% endfor %} 17 18 <!--ページネーション処理--> 19 {% if is_paginated %} 20 <div class="row justify-content-between align-items-center mb-4"> 21 <div class="col-lg"> 22 <nav aria-label="Bootstrap Pagination Example"> 23 <ul class="pagination mb-0"> 24 <!--前ページへのリンク--> 25 {% if page_obj.has_previous %} 26 <li class="page-item"> 27 <a class="page-link" href="?page={{ page_obj.previous_page_number }}"> 28 <span class="mr-1 d-none d-sm-inline-block">←</span> Previous 29 </a> 30 </li> 31 {% endif %} 32 33 <!--ページ数表示--> 34 {% for page_num in page_obj.paginator.page_range %} 35 {% if page_obj.number == page_num %} 36 <li class="page-item active"> 37 <a class="page-item" href="#">{{ page_num }}</a> 38 </li> 39 {% else %} 40 <li class="page-item"> 41 <a class="page-link" href="?page={{ page_num }}">{{ page_num }}</a> 42 </li> 43 {% endif %} 44 {% endfor %} 45 46 <!--次ページへのリンク--> 47 {% if page_obj.has_next %} 48 <li class="page-item"> 49 <a class="page-link" href="?page={{ page_obj.next_page_number }}"> 50 Next<span class="ml-1 d-none d-sm-inline-block">→</span> 51 </a> 52 </li> 53 {% endif %} 54 </ul> 55 </nav> 56 </div> 57 </div> 58 {% endif %} 59 60 </div> 61</section> 62{% endfor %} 63
発生している問題
paginate_byで指定した値を上回る数の記事が表示され、さらにページネーションに関わる表示も一切ありませんでした。
ブラウザの検証ツールを用いてhtmlを確認してみたところ、ページネーションに関するコードが記載されていなかった為、テンプレートの{% if is_paginated %}
がFalseだと判定されたのだと理解しました。
原因はviewsでのページネーションに関わるメソッドのオーバーライドで一工夫する必要があるかと考えましたが、調べても同じような事例を見つけることができず、どうすれば良いのか頭を抱えています。
試したこと
・ブラウザのキャッシュを削除し再度読み込みを行なってもページネーションの表示がされることはありませんでした。
・下記のページを参考にget_paginate_byメソッドをオーバーライドしましたが、ブラウザ上の表示は変わりませんでした。
https://teratail.com/questions/243787
views.py
1def get_paginate_by(self, queryset): 2 return self.request.GET.get('paginate_by', MyPageView.paginate_by)
補足情報(FW/ツールのバージョンなど)
開発環境は下記の通りです
・python 3.7.6
・Anacondaローカル内
・Django3系
・MacOS
・Chromeブラウザ

あなたの回答
tips
プレビュー