質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

729閲覧

Positive Integer FieldでPV数を取得した記事について、PV数順に一覧表示させる方法

Yu-Yokochi

総合スコア7

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/07/08 18:17

前提・実現したいこと

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記のようにしたらどうなりますか。
blog_listはテンプレートにないため、削除しています。

python

1class CategoryListView(generic.ListView): 2 model = Category 3 template_name = 'blog/top.html' 4 5 def get_context_data(self, **kwargs): 6 ctx = super().get_context_data(**kwargs) 7 ctx['blog_views'] = Blog.objects.order_by('-views')[:4] 8 return ctx

投稿2020/07/09 08:11

hasami

総合スコア1277

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

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

Yu-Yokochi

2020/07/09 08:31

実現することができ、とても助かりました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問