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

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

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

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

Python 3.x

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

HTML

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

Q&A

解決済

1回答

972閲覧

Django モデル内カテゴリのカウント表示方法

Mario_11

総合スコア95

Django

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

Python 3.x

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

HTML

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

0グッド

0クリップ

投稿2020/08/08 23:04

編集2020/08/09 07:53

Django クエリセットのカウント表示方法を教えていただきたいです。
現在、二つのモデルの中のカテゴリを一覧で表示させており、その横にカウントを表示させたのですが、同じカテゴリが何度も表示されてしまいます。(なので横のカウントは全部1の表示です。)

↓こんな感じで表示されます。

sample

1男性 (1) 男性 (1) その他(1) 女性 (1) 2誕生日 (1) 女性 (1) その他 (1) 女性 (1) 3女性 (1) 男性 (1) 男性 (1) 女性 (1) 4その他 (1) 女性 (1) その他 (1) 女性 (1)

本来ならカテゴリ枠分の3つしか表示されず横のカウントが増えていって欲しいのですが、
どうすれば一括?で表示させることができるのでしょうか?

何かアドバイスをいただきたいです。
よろしくお願いいたします。

python

1 2#models.py 3class Post(models.Model): 4 CATEGORY = [ 5 (1, '男性'), 6 (2, '女性'), 7 (3, 'その他'), 8 ] 9 title = models.CharField('タイトル', max_length=70, null=True) 10 category = models.IntegerField(verbose_name='性別 ',choices=CATEGORY, default=1, null=True, blank=True,) 11 12class SubPost(models.Model): 13 Sub_CATEGORY = [ 14 (1, '北海道'), 15 (2, '東北'), 16 (3, '関東'), 17 (4, '中部'), 18 (5, '近畿'), 19 (6, '中国'), 20 (7, '四国'), 21 (8, '九州・沖縄'), 22 ] 23 name = models.CharField('名前', help_text='20文字以内', max_length=20, blank=True, null=True ) 24 category = models.IntegerField(verbose_name='カテゴリー ', blank=True, null=True, choices=Sub_CATEGORY,default=1) 25

python

1#views.py 2class CategoryView(View): 3 paginate_by = 10 4 """リスト一覧""" 5 def get(self, request, *args, **kwargs): 6 context = {} 7 lst = [p.get_category_display for p in Post.objects.order_by('-category')] 8 context['all_post_category_list'] = Counter(lst) 9 print(Counter(lst))#追加 10 11 12 context['all_subpost_category_list'] = SubPost.objects.annotate(category_count=Count('category')).order_by('-category') 13 14 return render(request, 'app/category_list.html', context) 15

html

1<p><h2>カテゴリ一覧</h2></p> 2<hr> 3<div class="lisits"> 4 <div class="card-columns"> 5 <ul> 6 {% for categorys in all_post_category_list %} 7 <div class="card"> 8 <li> 9 {{ categorys.get_category_display }} 10 ({{ categorys.categorys.category_count }}) 11 </a> 12 </li> 13 </div> 14 {% endfor %} 15 </ul> 16 </div> 17</div> 18

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

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

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

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

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

guest

回答1

0

ベストアンサー

Python

1# views 2from collections import Counter 3 4lst = [p.get_category_display() for p in Post.order_by('-category')] 5context['all_post_category_list'] = Counter(lst) 6```で、 7```HTML 8{% for k, v in all_post_category_list.items %} 9 <div class="card"> 10 <li> 11 {{ k }} 12 ({{ v }}) 13 </li> 14 </div> 15{% endfor %} 16```こんな感じでしょうか?

投稿2020/08/09 01:23

編集2020/08/09 08:05
ForestSeo

総合スコア2722

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

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

Mario_11

2020/08/09 02:14

回答していただきありがとうございます! 上記のコードを試してみたのですが、下記のようなエラーが出てしまいました。 type object 'Item' has no attribute 'order_by' なので、Post.objects.order_byに書き換えさせていただいて上記のエラーは消えたのですが、HTMLのところで、 'int' object is not iterable というエラーが出てしまいました。 この場合はviewsを直すべきなのでしょうか?
ForestSeo

2020/08/09 05:27

> Post.objects.order_byに書き換え すみません。コピペミスです
ForestSeo

2020/08/09 05:30

> 'int' object is not iterable HTMLのforのところでしょうか? printでCounter(lst)の中身をコンソールに出してみてもらえますか?
Mario_11

2020/08/09 06:19

中身はこんな感じでした。 Counter({functools.partial(<bound method Model._get_FIELD_display of <Post: タイトル>>, field=<django.db.models.fields.IntegerField: category>): 1}) よろしくお願いします。
ForestSeo

2020/08/09 07:31

print(Counter(lst)) とやりましたか?
Mario_11

2020/08/09 07:57

追記のように context['all_post_category_list'] = Counter(lst) の下に print(Counter(lst)) を配置して先ほどのコードが出力されました。 エラー箇所はHTMLのforのところだと思います。
ForestSeo

2020/08/09 08:04 編集

あー分かりました。 今編集します
ForestSeo

2020/08/09 08:08

get_category_display() の()が必要でした
Mario_11

2020/08/09 09:17

何度も申し訳ありません。 ()を付けて表示したみたのですが、同じエラーが出ました。 'int' object is not iterable print(Counter(lst))の中身が少し変わって Counter({'女性': 1, '男性: 1}) のようになっていました。 いろいろ変えてみたのですが自分では解決できず、聞いてばかりですが申し訳ないのですが、もう少し教えていただきたいです。 よろしくお願いいたします。
ForestSeo

2020/08/09 09:28

Counter({'女性': 1, '男性: 1})になっていたら、HTMLで.itemsで取得できます。 context['all_post_category_list'] = Counter(lst) や、 {% for k, v in all_post_category_list.items %} になっていますか?
Mario_11

2020/08/09 10:45

上記のものを書いてるのですが、同じエラーでした。 バージョンなど他に考えられることを1から調べてみたいと思います。 解決したら質問に追記します。 詳しく説明していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問