前提・実現したいこと
Djangoを勉強しております。
Python(Django)を用いて、PV数順に人気記事一覧セクションを作成したいです。
(閲覧数は記事詳細ページが開かれた回数でカウント)
具体的には、人気記事一覧セクションがあるページの概観を以下のようにしたいです。
___________________
ヘッダー
トップニュース
記事(PV数第1位)
記事(PV数第2位)
記事(PV数第3位)
記事(PV数第4位)
カテゴリ1
記事
記事
記事
記事
カテゴリ2
記事
記事
記事
記事
カテゴリ3
記事
記事
記事
記事
フッダー
現状
人気記事一覧セクションがあるページのテンプレートファイル(top.html)
html
1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 <h1>トップページ</h1> 9 <p>トップニュース</p> 10 {% for blog in blog_view %} 11 <article> 12 <h2>{{ blog.title}}</h2> 13 </article> 14 {% endfor %} 15 {% for category in object_list|slice:":3" %} 16 <div> 17 <a>{{category.name}}</a> 18 {% for blog in category.blogs.all|slice:":4" %} 19 <article> 20 <h2>{{ blog.title}}</h2> 21 </article> 22 {% endfor %} 23 <a href="{% url 'blog:category_list' category.pk %}">このカテゴリをもっと見る</a> 24 </div> 25 {% endfor %} 26 </body> 27</html> 28
url.py(該当箇所のみ)
Python
1urlpatterns = [ 2 path('',views.CategoryListView.as_view(), name='top'), 3 path('detail/<int:pk>/',views.detail,name='blog_detail'), 4]
ビュー(views.py 該当箇所のみ)
Python
1class CategoryListView(generic.ListView): 2 model = Category 3 template_name = 'blog/top.html' 4 5 def top(request,id): 6 context = { 7 'categories': Category.objects.all(), 8 'blog_list': Blog.objects.filter(category_id=id), 9 'blog_views': Blog.objects.order_by('-views')[:4], 10 } 11 return render(request, 'blog/top.html',context) 12 13def detail(request,pk): 14 try: 15 blog = Blog.objects.get(pk=pk) 16 except Blog.DoesNotExist: 17 raise Http404 18 19 context = { 20 'blog':blog, 21 } 22 blog.views += 1 23 blog.save() 24 return render(request, 'blog/blog_detail.html', context)
モデル(models.py 該当箇所のみ)
Python
1class Category(models.Model): 2 name = models.CharField('カテゴリ名', max_length=255) 3 views = models.PositiveIntegerField(default=0) 4 5 def __str__(self): 6 return self.name 7 8class Blog(models.Model): 9 category = models.ForeignKey(Category,verbose_name='カテゴリ',on_delete=models.PROTECT,related_name='blogs') 10 title = models.CharField('記事タイトル',max_length=255) 11 text = models.TextField('記事本文',blank=False) 12 created_at = models.DateTimeField('作成日',default=timezone.now) 13 views = models.PositiveIntegerField(default=0) 14 15 def __str__(self): 16 return self.title
発生している問題・エラーメッセージ
現状エラーは出ていません。
問題は、"前提・実現したいこと"に示したページの概観であって欲しいところが、以下のようになってしまいます。(for文内が表示されていない)
___________________
ヘッダー
トップニュース
カテゴリ1
記事
記事
記事
記事
カテゴリ2
記事
記事
記事
記事
カテゴリ3
記事
記事
記事
記事
フッダー
試したこと
以下の記事の通りに実行した結果、現在のような問題が生じました。
https://zerofromlight.com/blogs/detail/21/
また、contextのなかに
'blog':Blog.objects.get(pk=pk)
を加えましたが状況は変わりませんでした。
全く正解への検討がつかず、試せられていることは少ないです。
非常に経験が浅く、周りに頼れる人もいないため、質問させていただくこととしました。
お手数おかけしますが、知恵をお貸しいただけないでしょうか。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Python 3.6.2
Django 2.0
開発環境:Mac
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/09 08:31