回答編集履歴

2

「 追記 2019/04/01 その 2 」を追加しました。

2019/04/01 13:04

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -115,3 +115,67 @@
115
115
  {% endfor %}
116
116
 
117
117
  ```
118
+
119
+
120
+
121
+ ### 追記 2019/04/01 その 2
122
+
123
+
124
+
125
+ 別件で調べものをしていてたまたま知ったのですが、 Django の組み込みのタグに `regroup` というものがあり、これがまさに今回の用途に使えるもののようです。私の当初の回答が覆ってしまいますが、よろしければチェックしてみてください。
126
+
127
+
128
+
129
+ - [regroup | Built-in template tags and filters | Django documentation | Django](https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#regroup)
130
+
131
+
132
+
133
+ 公式ドキュメントを読むかぎりでは、次のような形で使えるようです。
134
+
135
+
136
+
137
+ view から次の変数がテンプレートに渡されたものとします。
138
+
139
+
140
+
141
+ ```python
142
+
143
+ person_all = Person.objects.all().order_by('name_kana')
144
+
145
+ ```
146
+
147
+
148
+
149
+ `regroup` タグを使うと、上のアプローチと同様の出力結果が次の記述で得られるようです。
150
+
151
+
152
+
153
+ ```text
154
+
155
+ {% regroup person_all by kana_initial as grouped_persons %}
156
+
157
+
158
+
159
+ <ul>
160
+
161
+ {% for group in grouped_persons %}
162
+
163
+ <h3>{{ group.grouper }}</h3>
164
+
165
+ <ul>
166
+
167
+ {% for person in group.list %}
168
+
169
+ <li>{{ person.name }}</li>
170
+
171
+ {% endfor %}
172
+
173
+ </ul>
174
+
175
+ {% endfor %}
176
+
177
+ ```
178
+
179
+
180
+
181
+ `kana_initial` のところはメソッド `kana_initial()` をプロパティ化するなりしないと正しく動かないかもしれませんが、ともあれ、別解として `regroup` タグを使うアプローチもあったようです。私自身勉強になりました。ご参考まで……

1

「 追記 2019/04/01 」を追加しました。

2019/04/01 13:04

投稿

gh640
gh640

スコア1407

test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  ```html
34
34
 
35
- {% for group_key, persons in grouped_persons %}
35
+ {% for group_key, persons in grouped_persons.items %}
36
36
 
37
37
  <h3>{{ group_key }}</h3>
38
38
 
@@ -61,3 +61,57 @@
61
61
 
62
62
 
63
63
  - [groupby | itertools | Functions creating iterators for efficient looping — Python documentation](https://docs.python.org/3/library/itertools.html#itertools.groupby)
64
+
65
+
66
+
67
+ ### 追記 2019/04/01
68
+
69
+
70
+
71
+ ご解決されたようでよかったです。
72
+
73
+
74
+
75
+ > ご提案のまま実行すると「Need 2 values to unpack in for loop; got 1.」とエラーが出ましたが、...
76
+
77
+
78
+
79
+ ご指摘いただきありがとうございます。おっしゃるとおりですね。誰かが後で参考にするときのために上の回答を修正しておきます。
80
+
81
+
82
+
83
+ それと、 `grouped_persons` を `dict` にしておくとテンプレート側で `.items` をつけないといけないのであれば、次のように、 `groupby()` の戻り値をそのまま `grouped_persons` に入れておいて
84
+
85
+
86
+
87
+ ```python
88
+
89
+ grouped_persons = groupby(person_all, lambda p: p.kana_initial())
90
+
91
+ ```
92
+
93
+
94
+
95
+ テンプレート側は次のように書く形でもよかったかもしれませんね。
96
+
97
+
98
+
99
+ ```html
100
+
101
+ {% for group_key, persons in grouped_persons %}
102
+
103
+ <h3>{{ group_key }}</h3>
104
+
105
+ <ul>
106
+
107
+ {% for person in persons %}
108
+
109
+ <li>{{person.name}}</li>
110
+
111
+ {% endfor %}
112
+
113
+ </ul>
114
+
115
+ {% endfor %}
116
+
117
+ ```