teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

質問内容が分かりにくかったため、編集しました

2019/01/28 11:58

投稿

shohei0718
shohei0718

スコア17

title CHANGED
@@ -1,1 +1,1 @@
1
- Djangoでのデタ集計分かりません。。。
1
+ 辞書オブジェクトをforルプで回しても値取得できません。。。
body CHANGED
@@ -3,185 +3,108 @@
3
3
  Python 3.7.1
4
4
  Django version 2.1.5
5
5
 
6
- ### 実現したいこと
7
-
8
- 登録したデータを下記の表のように集計したいです。
9
- ※プログラミング(2)というのは、プログラミングのレッスンを2回受けたという意味です。
10
- ![イメージ説明](5fddc19df6eeb4eef704440dfa4bfdbf.png)
11
-
12
6
  ### 困っていること
13
- ャンルがうまく表示できない
7
+ ・Djangoのtemplate/.htmlファイル内で、辞書オブェクトをforープで回して、値を取得したい、取得できない
14
- 色々と調べてみまたがうまくいかない原因がmodel・views・templateいずれかのが分からず、途方に暮れています。
8
+ 辞書のforループで、キーを取得し、『 辞書['キー'] 』形でキー対す値を取得するコードを書いているが、
9
+ Could not parse the remainder: '['key']' from 'invoice['key']'というエラーが出てしまう。
15
10
 
16
- ### 現在の状況
11
+ ### 試したこと
17
- CSSをまだ当てていないので、見にくいですが、現在は、下記のような状態です。
18
12
 
19
- ![![イメージ説明](630c7e97d5f8e1bdd5bba2f7df634362.png)
20
-
21
- もともと登録しているデータは下記のようなデータなので、
22
-
23
- ![イメージ説明](eb7a6767d91a0e856e7c5b9c67abf2db.png)
24
-
25
- 最終的には、
26
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
27
- 顧客ID  顧客名  ジャンル  合計レッスン数   請求金額
28
-   1     SQL   英語(2)    2       ・・・・
29
- ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
30
-
31
- のように表示したいです。
32
- ※英語(2)は英語のレッスンを2回受けたという意味です。
33
-
34
- ### 現状のソースコード
35
-
36
- ```models
37
- from django.db import models
38
- from django.utils import timezone
39
- from datetime import date
40
- from django.core.validators import MaxValueValidator, MinValueValidator
41
-
42
- class Customer(models.Model):
43
- Men = '男'
44
- Women = '女'
45
- GENDER = (
46
- (Men, '男'),
47
- (Women, '女'),
48
- )
49
-
50
- name = models.CharField('名前', max_length = 20)
51
- gender = models.CharField(
52
- '性別',
53
- max_length = 1,
54
- choices=GENDER,
55
- )
56
- age = models.IntegerField('年齢')
13
+ 下記のように、htmlファイル上で、forループを回しましたが、エラーになります。
57
-
58
- class Lesson(models.Model):
59
- English = '英語'
60
- Finance = 'ファイナンス'
61
- Programing = 'プログラミング'
62
- GENRE = (
63
- (English, '英語'),
64
- (Finance, 'ファイナンス'),
65
- (Programing, 'プログラミング'),
66
- )
67
-
68
- customer = models.ForeignKey(Customer, verbose_name='顧客名', on_delete=models.PROTECT)
69
-
70
- genre = models.CharField(
71
- 'ジャンル',
72
- max_length = 255,
73
- choices=GENRE,
74
- default=English)
75
- lesson_day = models.DateField('受講日')
76
- lesson_time = models.PositiveIntegerField(
77
- '受講時間(h)',
78
- default = 1,
79
- validators=[
80
- MaxValueValidator(12),
81
- MinValueValidator(1)
82
- ]
83
- )
84
- price = models.IntegerField('支払金額', null=True)
85
-
86
-
87
- class Invoice(models.Model):
88
-
89
- customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
90
- lesson = models.ForeignKey(Lesson, on_delete=models.PROTECT)
91
- ```
92
-
93
- ```views
94
- from django.shortcuts import render, redirect
95
-
96
- from django.template.response import TemplateResponse
97
-
98
- from django.http import HttpResponseRedirect
99
- from django.http import Http404
100
- from django.http import HttpResponse
101
-
102
- from django.urls import reverse
103
-
104
- from exam.models import Customer
105
- from exam.models import Lesson
106
- from exam.models import Invoice
107
-
108
- from exam.forms import CustomerForm
109
- from exam.forms import CustomerEdit
110
- from exam.forms import LessonForm
111
- from exam.forms import LessonEdit
112
-
113
- from IPython import embed
114
- from IPython.terminal.embed import InteractiveShellEmbed
115
-
116
- ##途中は省略
117
-
118
- def invoice_index(request):
119
- customers = Customer.objects.all()
120
- lessons = Lesson.objects.all()
121
-
122
- return render(request, 'exam/invoice_index.html', {'customers': customers, 'lessons':lessons})
123
- ```
124
-
125
14
  ```html
126
- <body>
127
- <h2>月別請求一覧</h2>
128
15
 
16
+ <body>
17
+ <h2>月別請求一覧</h2>
18
+ <table class="table">
129
- <table>
19
+ <thead>
130
- <tr>
20
+ <tr>
21
+ <td>顧客ID</td>
22
+ <td>顧客名</td>
23
+ <td>ジャンル</td>
131
- <th>顧客ID</th><th>顧客名</th><th>ジャンル</th><th>合計レッスン数</th><th>請求金額</th>
24
+ <td>合計レッスン数</td>
25
+ <td>請求金額</td>
132
- </tr>
26
+ </tr>
133
- </table>
27
+ </thead>
134
- {% for customer in customers %}
135
- <table>
28
+ <tbody>
29
+ {% for invoice in invoice_list %}
30
+ {% for key in invoice.keys %}
136
- <tr>
31
+ <tr>
137
- <td>{{ customer.id }}</td>
138
- <td>{{ customer.name }}</td>
32
+ <td>{{ invoice['key'] }}</td>
139
- {% for lesson in lessons %}
140
- <td>{{ lesson.genre }}</td>
33
+ </tr>
141
34
  {% endfor %}
35
+ {% endfor %}
142
- </tr>
36
+ </tbody>
143
- </table>
37
+ </table>
38
+ <a href="{% url 'index' %}">メニューに戻る</a>
144
- {% endfor %}
39
+ </body>
145
40
 
146
- </body>
147
41
  ```
148
42
 
43
+ 以下、ビュー関数です。
149
44
 
150
- ### 試したこと
151
-
152
- 下記のように辞書を用意して、各レッスンを受けた回数を集計し、htmlで表示させようとしましたが、
153
-
154
45
  ```views
155
46
  def invoice_index(request):
156
47
  customers = Customer.objects.all()
48
+ genre_sum_template = {'英語': 0, 'ファイナンス': 0, 'プログラミング': 0}
49
+ invoice_list = []
157
50
 
51
+ for customer in customers:
52
+ price_sum = 0
158
- genre_sum = {'英語': 0, 'ファイナンス': 0, 'プログラミング': 0}
53
+ genre_sum = genre_sum_template.copy()
159
54
 
160
- for customer in customers
161
- lesson = customer.lesson_set.all()
55
+ lessons = customer.lesson_set.all()
56
+ lesson_sum = lessons.count()
57
+
162
58
  for lesson in lessons:
59
+ columns = {}
163
60
  genre = lesson.genre
164
61
  genre_sum[genre] += 1
165
- ```
166
62
 
167
- 実際にシェルで試してみると、下記のように回数は数えることができたのですが、
168
- 顧客別に取得することができませんでした。
63
+ price = lesson.price
64
+ price_sum += price
169
65
 
170
- ```
171
- In [17]: for customer in customers:
66
+ columns['id'] = customer.id
172
- ...: lessons = customer.lesson_set.all()
67
+ columns['name'] = customer.name
68
+ columns['genre'] = genre_sum
173
- ...: for lesson in lessons:
69
+ columns['lesson'] = lesson_sum
174
- ...: genre = lesson.genre
175
- ...: genre_sum[genre] += 1
176
- ...: print(genre_sum)
70
+ columns['price'] = price_sum
177
- ...:
178
- ...:
179
- {'英語': 1, 'ファイナンス': 0, 'プログラミング': 0}
180
- {'英語': 2, 'ファイナンス': 0, 'プログラミング': 0}
181
- {'英語': 2, 'ファイナンス': 1, 'プログラミング': 0}
182
- {'英語': 2, 'ファイナンス': 1, 'プログラミング': 1}
183
71
 
72
+ invoice_list.append(columns)
73
+
74
+ return render(request, 'exam/invoice_index.html', {'customers': customers, 'columns':columns, 'invoice_list':invoice_list})
184
75
  ```
185
76
 
77
+ ### 実現したいこと
78
+
79
+ イメージとしては、下記のコードのような形で、キーに対する値を取得し、htmlファイルの<thead>の<td>に対応したデータを取得し、表示させたい(※下記コードはイメージです。)
80
+
81
+ ```html
82
+ <body>
83
+ <h2>月別請求一覧</h2>
84
+ <table class="table">
85
+ <thead>
86
+ <tr>
87
+ <td>顧客ID</td>
186
- 初歩的な質問かもしれませんが、とても困っているので、
88
+ <td>顧客名</td>
89
+ <td>ジャンル</td>
90
+ <td>合計レッスン数</td>
91
+ <td>請求金額</td>
187
- 是非、お力添え頂けないでしょうか
92
+ </tr>
93
+ </thead>
94
+ <tbody>
95
+ {% for invoice in invoice_list %}
96
+ {% for key in invoice.keys %}
97
+ <tr>
98
+ <td>{{ invoice['key'] }}</td>
99
+ <td>{{ invoice['key'] }}</td>
100
+ <td>{{ invoice['key'] }}</td>
101
+ <td>{{ invoice['key'] }}</td>
102
+ <td>{{ invoice['key'] }}</td>
103
+ </tr>
104
+ {% endfor %}
105
+ {% endfor %}
106
+ </tbody>
107
+ </table>
108
+ <a href="{% url 'index' %}">メニューに戻る</a>
109
+ </body>
110
+ ```