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

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

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

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

Python 3.x

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

Q&A

解決済

1回答

555閲覧

辞書オブジェクトをforループで回しても値が取得できません。。。

shohei0718

総合スコア17

Django

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

Python 3.x

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

0グッド

0クリップ

投稿2019/01/27 08:51

編集2019/01/28 11:58

前提

Python 3.7.1
Django version 2.1.5

困っていること

・Djangoのtemplate/.htmlファイル内で、辞書オブジェクトをforループで回して、値を取得したいが、取得できない。
→辞書のforループで、キーを取得し、『 辞書['キー'] 』の形でキーに対する値を取得するコードを書いているが、
Could not parse the remainder: '['key']' from 'invoice['key']'というエラーが出てしまう。

試したこと

下記のように、htmlファイル上で、forループを回しましたが、エラーになります。

html

1 2 <body> 3 <h2>月別請求一覧</h2> 4 <table class="table"> 5 <thead> 6 <tr> 7 <td>顧客ID</td> 8 <td>顧客名</td> 9 <td>ジャンル</td> 10 <td>合計レッスン数</td> 11 <td>請求金額</td> 12 </tr> 13 </thead> 14 <tbody> 15 {% for invoice in invoice_list %} 16 {% for key in invoice.keys %} 17 <tr> 18 <td>{{ invoice['key'] }}</td> 19 </tr> 20 {% endfor %} 21 {% endfor %} 22 </tbody> 23 </table> 24 <a href="{% url 'index' %}">メニューに戻る</a> 25 </body> 26

以下、ビュー関数です。

views

1def invoice_index(request): 2 customers = Customer.objects.all() 3 genre_sum_template = {'英語': 0, 'ファイナンス': 0, 'プログラミング': 0} 4 invoice_list = [] 5 6 for customer in customers: 7 price_sum = 0 8 genre_sum = genre_sum_template.copy() 9 10 lessons = customer.lesson_set.all() 11 lesson_sum = lessons.count() 12 13 for lesson in lessons: 14 columns = {} 15 genre = lesson.genre 16 genre_sum[genre] += 1 17 18 price = lesson.price 19 price_sum += price 20 21 columns['id'] = customer.id 22 columns['name'] = customer.name 23 columns['genre'] = genre_sum 24 columns['lesson'] = lesson_sum 25 columns['price'] = price_sum 26 27 invoice_list.append(columns) 28 29 return render(request, 'exam/invoice_index.html', {'customers': customers, 'columns':columns, 'invoice_list':invoice_list})

実現したいこと

イメージとしては、下記のコードのような形で、キーに対する値を取得し、htmlファイルの<thead><td>に対応したデータを取得し、表示させたい(※下記コードはイメージです。)

html

1 <body> 2 <h2>月別請求一覧</h2> 3 <table class="table"> 4 <thead> 5 <tr> 6 <td>顧客ID</td> 7 <td>顧客名</td> 8 <td>ジャンル</td> 9 <td>合計レッスン数</td> 10 <td>請求金額</td> 11 </tr> 12 </thead> 13 <tbody> 14 {% for invoice in invoice_list %} 15 {% for key in invoice.keys %} 16 <tr> 17 <td>{{ invoice['key'] }}</td> 18 <td>{{ invoice['key'] }}</td> 19 <td>{{ invoice['key'] }}</td> 20 <td>{{ invoice['key'] }}</td> 21 <td>{{ invoice['key'] }}</td> 22 </tr> 23 {% endfor %} 24 {% endfor %} 25 </tbody> 26 </table> 27 <a href="{% url 'index' %}">メニューに戻る</a> 28 </body>

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/01/27 16:42

どうして困っているというのかよく分かりません。 勉強目的であれば、じっくりやってください。 forで回すのもありですが、課題の意図としては、SQLでjoinやgroup byしたりさせたいのではないかと思います。そうなるようなクエリを作れるといいですね。具体的には'__'で繋いだ名前やvaluesです。 まずはforで回す形が後一歩のようなので、それをやって頂いて、次にクエリ側でのやり方をマスタしてください。
firedfly

2019/01/28 06:22

こんにちは。 ていねいに自分の状況とコードを説明してくれてありがとうございます。 ただ、自分が困っていること・解決できないことを明確化して質問はできるだけコンパクトにしましょう。 「レッスンを受けた回数を集計できない」という小さな困りごとは、 shohei0718さんの大目標である「DjangoでのWebアプリ作成」のごく一部。 今回でいえばmodel・views・templateのどれが問題なのか切り分ける方法はあるはずです。
shohei0718

2019/01/28 11:59

質問内容が分かりづらくて申し訳ございませんでした。現在の状況に即して、質問内容を修正させて頂きました。
wwbQzhMkhhgEmhU

2019/01/28 12:28

後コンパクトにまとめるのはやめてください。 分からない部分をうまく説明できない人が(通常分からないんだから当たり前)、自分の判断で情報を削ってしまうと、聞いてる人に正しく伝わらない可能性が高くなります。もし、それで読み手が困るようであれば、読み手側に問題があるだけです。
guest

回答1

0

ベストアンサー

こんにちは。

forループがわかっておられないようです。
「二重のforループで九九を表示」に挑戦して
プログラミングの基礎から学ばれるとよいかと思います。

それはそれとして、下のように顧客別に辞書を分けて集計するのでどうでしょうか。

Python

1def invoice_index(request): 2 customers = Customer.objects.all() 3 4 genre_sum_template = {'英語': 0, 'ファイナンス': 0, 'プログラミング': 0} 5 6 for customer in customers 7 genre_sum = genre_sum_template.copy() 8 lesson = customer.lesson_set.all() 9 for lesson in lessons: 10 genre = lesson.genre 11 genre_sum[genre] += 1 12 print("ID:{} Name:{} Lesson:{}".format(customer.id, customer.name, genre_sum))

投稿2019/01/28 06:35

編集2019/01/28 06:37
firedfly

総合スコア1131

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

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

shohei0718

2019/01/28 12:03 編集

firedlfyさん こんにちわ。ご指摘頂きまして有難うございます。 アドバイス頂いたコードをもとに、ジャンルだけでなく、その他の項目も追加し、辞書オブジェクトに入れることができましたが、htmlファイルにうまく表示することができません(質問内容を編集させて頂きましたので、ご覧頂けますと幸いです)
wwbQzhMkhhgEmhU

2019/01/28 12:18

勉強目的であれば「自分で」やってください。
firedfly

2019/01/28 12:24

うまくいってようございました。 ただ、お気持ちはわかりますが、teratailは希望の機能を実装し終えるまで つきっきりで面倒をみてもらうサービスではなく、あくまでQ&Aを蓄積するサービスとなります。 つまり、試行錯誤しても突破できなかった「特定の問題」に対してアドバイスをもらう。 すると似た問題にあたった人が検索して、質問と解答を参考にできる、という訳です。 なので質問は書き換えずに、ひとつ問題が解決するたびにベストアンサーを選んでいただき、 何時間かご自分で調査と試行錯誤をして……それでも解決しなければ 別の質問を立てる、というのが基本的な使い方になります。 (気にいった回答者をフォローして、また頼むということも可能です) ご理解いただけますと幸いです。
wwbQzhMkhhgEmhU

2019/01/28 12:37

ノウハウの蓄積という意味では、情報不足な質問はどんどん書き換えて行くべきですが、当初と内容の違うものや、実際に聞きたいことが複数になってしまう書き換えはダメです。
shohei0718

2019/01/28 13:53

大変失礼致しました。 今後は、安易に質問内容を書き直さないようにします。 もともと投稿していた質問内容は解決していますので、一晩寝かして、明日再度チャレンジして、それでも分からなければ、新しく質問を投稿するように致します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問