回答編集履歴

3

追記

2020/01/07 01:36

投稿

quickquip
quickquip

スコア11231

test CHANGED
@@ -111,3 +111,203 @@
111
111
  ```
112
112
 
113
113
  と短く書けましたが、これも解説したくない、**強く**保守したくない、と思ってしまったので、やはりデータ構造を見直すべきです。
114
+
115
+
116
+
117
+ ----
118
+
119
+ 追記
120
+
121
+ ```python
122
+
123
+ @register.filter(name='get')
124
+
125
+ def get_attr(a, b):
126
+
127
+ return a[b]
128
+
129
+
130
+
131
+ ```
132
+
133
+ というカスタムフィルタを定義すると
134
+
135
+ ```html
136
+
137
+ {% for f in fir %}
138
+
139
+ {% with fir_index=forloop.counter0 %}
140
+
141
+ <h1>{{ f }}</h1>
142
+
143
+ {% for s in sec|get:fir_index %}
144
+
145
+ {% with sec_index=forloop.counter0 %}
146
+
147
+ <h2>{{ s }}</h2>
148
+
149
+ {% for t in third|get:fir_index|get:sec_index %}
150
+
151
+ <h3>{{ t }}</h3>
152
+
153
+ {% endfor %}
154
+
155
+ {% endwith %}
156
+
157
+ {% endfor %}
158
+
159
+ {% endwith %}
160
+
161
+ {% endfor %}
162
+
163
+ ```
164
+
165
+ となりました。これなら後から理解できそう。
166
+
167
+
168
+
169
+ ----
170
+
171
+
172
+
173
+ 質問に書いてあるような、無味乾燥で意味を含まないデータからは判断できない、というのが正直なところです。
174
+
175
+
176
+
177
+ 単純には
178
+
179
+
180
+
181
+ ```pyhton
182
+
183
+ hoge = {
184
+
185
+ 'arr': [
186
+
187
+ [
188
+
189
+ "1",
190
+
191
+ [
192
+
193
+ ["1111", ['1111-1', '1111-2']],
194
+
195
+ ["1112", ['1112-1', '1112-2']]
196
+
197
+ ]
198
+
199
+ ],
200
+
201
+ [
202
+
203
+ "2",
204
+
205
+ [
206
+
207
+ ["2111", ['2111-1', '2111-2']],
208
+
209
+ ["2112", ['2112-1', '2112-2']]
210
+
211
+ ]
212
+
213
+ ]
214
+
215
+ ],
216
+
217
+ }
218
+
219
+ ```
220
+
221
+ となっていれば
222
+
223
+ ```html
224
+
225
+ {% for f, st in arr %}
226
+
227
+ <h1>{{ f }}</h1>
228
+
229
+ {% for s, t in st %}
230
+
231
+ <h2>{{ s }}</h2>
232
+
233
+ {% for t_item in t %}
234
+
235
+ <h3>{{ t_item }}</h3>
236
+
237
+ {% endfor %}
238
+
239
+ {% endfor %}
240
+
241
+ {% endfor %}
242
+
243
+ ```
244
+
245
+ と書けるでしょうし、
246
+
247
+
248
+
249
+ ```python
250
+
251
+ hoge = {
252
+
253
+ 'dic': {
254
+
255
+ "1":
256
+
257
+ {
258
+
259
+ "1111": ['1111-1', '1111-2'],
260
+
261
+ "1112": ['1112-1', '1112-2'],
262
+
263
+ },
264
+
265
+ "2":
266
+
267
+ {
268
+
269
+ "2111": ['2111-1', '2111-2'],
270
+
271
+ "2112": ['2112-1', '2112-2'],
272
+
273
+ }
274
+
275
+ }
276
+
277
+ }
278
+
279
+ ```
280
+
281
+ となっていれば
282
+
283
+ ```html
284
+
285
+ {% for f, st in dic.items %}
286
+
287
+ <h1>{{ f }}</h1>
288
+
289
+ {% for s, t in st.items %}
290
+
291
+ <h2>{{ s }}</h2>
292
+
293
+ {% for t_item in t %}
294
+
295
+ <h3>{{ t_item }}</h3>
296
+
297
+ {% endfor %}
298
+
299
+ {% endfor %}
300
+
301
+ {% endfor %}
302
+
303
+ ```
304
+
305
+ と書けるでしょう。
306
+
307
+
308
+
309
+ 後者で、辞書のキーになる部分に重複があり得るならこのようには書けないです。また、古いPythonを考慮するなら`OrderedDict`を使うべきです。
310
+
311
+
312
+
313
+ テンプレート側の書きやすさと見やすさ、Pythonコード側の書きやすさと見やすさのバランスを取っていく必要があるので、表示しようとしているデータの中身がどう作られるのかも明らかでないと判断しにくいですね。

2

追記

2020/01/07 01:36

投稿

quickquip
quickquip

スコア11231

test CHANGED
@@ -75,3 +75,39 @@
75
75
  <h1>1</h1><h2>1111</h2><h3>1111-1</h3><h3>1111-2</h3><h2>1112</h2><h3>1112-1</h3><h3>1112-2</h3><h1>2</h1><h2>2111</h2><h3>2111-1</h3><h3>2111-2</h3><h2>2112</h2><h3>2112-1</h3><h3>2112-2</h3>
76
76
 
77
77
  ```
78
+
79
+
80
+
81
+ ----
82
+
83
+
84
+
85
+ 追記
86
+
87
+ [https://stackoverflow.com/questions/2415865/iterating-through-two-lists-in-django-templates#answer-14857664](https://stackoverflow.com/questions/2415865/iterating-through-two-lists-in-django-templates#answer-14857664)
88
+
89
+ にあるzipフィルタを使って
90
+
91
+ ```html
92
+
93
+ {% for fs, t in fir|zip:sec|zip:third %}
94
+
95
+ <h1>{{ fs.0 }}</h1>
96
+
97
+ {% for st in fs.1|zip:t %}
98
+
99
+ <h2>{{ st.0 }}</h2>
100
+
101
+ {% for t in st.1 %}
102
+
103
+ <h3>{{ t }}</h3>
104
+
105
+ {% endfor %}
106
+
107
+ {% endfor %}
108
+
109
+ {% endfor %}
110
+
111
+ ```
112
+
113
+ と短く書けましたが、これも解説したくない、**強く**保守したくない、と思ってしまったので、やはりデータ構造を見直すべきです。

1

些細

2020/01/07 01:01

投稿

quickquip
quickquip

スコア11231

test CHANGED
@@ -1,4 +1,4 @@
1
- 解説したくない、保守なんて**絶対に**したくない、というようなテンプレートになってしまったのでデータを見直すべきです。
1
+ 解説したくない、保守なんて**絶対に**したくない、というようなテンプレートになってしまったのでデータ構造を見直すべきです。
2
2
 
3
3
  ```html
4
4