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

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

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

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

Q&A

解決済

2回答

3184閲覧

Djangoのテンプレートでif文の条件に合致しなかった場合に固定の値を表示させたい。

s-hara

総合スコア52

Django

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

0グッド

0クリップ

投稿2018/12/05 06:15

【実現したいこと】
Djangoのテンプレートで2つのリストデータを受け取り、多重forループ内でif文で2つのリストデータを比較して1回も一致しなかった場合に固定値(数字のゼロなど)を表示させたい。

以下、具体的に記載します。

view.pyで以下のリストデータを定義してテンプレートへ渡します。

python

1list_data1 = ['A001','A002','A003','A004'] 2list_data2 = [['A001','100'],['A002','200'],['A004','400']] 3 4return render(request, '****.html',{ 5 'list_data1': list_data1, 6 'list_data2': list_data2, 7 } )

■テンプレート側

python

1{% for x in list_data1 %}   #ループ1 2 {% for a,b in list_data2 %}    #ループ2 3 {% if a == x %} 4 {{b}} 5 {% endif %} 6 {% endfor %} 7{% endfor %}

上記で、forループ1でlist_data1が'A003'の回のループは
{% if a == x %}に該当するデータがない(list_data2に'A003'がない)
ので{{b}}の部分が表示されませんが、ループ1のlist_data1=A003において
ループ2を全部回した結果{% if a == x %}に合致するものが1回もなかった
場合に、固定値ゼロ「0」を表示させたいのですが、そのような制御をDjango
のテンプレートで実装する方法がわかりません。

実現方法がわかる方いましたら、ご教授のほどよろしくお願い致します。

環境:Django2.0.6

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

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

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

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

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

guest

回答2

0

ベストアンサー

テンプレートのタグで使えそうなものがないか確認してみましたが、状態を保持できるようなものがないので、ご要望しているような処理は、テンプレート内ではできなさそうですね。

テンプレート内で判断する理由が特にないのであれば、テンプレートに渡す前に、下記のようなフォーマットに変換(テンプレートでやろうとしている処理をrender()呼び出し前に実施)してしまう方法が取れると思います。

python

1list_data = [ 2 {"label": "A001", "value": 100}, 3 {"label": "A002", "value": 200}, 4 {"label": "A003", "value": 0}, 5 {"label": "A004", "value": 400}]

Django

1 {% for item in list_data %} 2 {{item.label}}:{{item.value}} 3 {% endfor %}

一つのラベルが、複数回出てくることを想定するなら、valueをArrayにしても良いですね。その場合は、valueの処理でループが必要になります。

投稿2018/12/06 01:25

Meganezaru

総合スコア715

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

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

s-hara

2018/12/07 21:55

ありがとうございます。はやりテンプレート側で処理させるメリットもないので、ビュー側で制御すればよいですね・・・
guest

0

こういうことですか?

Python

1{% for x in list_data1 %}   #ループ1 2 {% for a,b in list_data2 %}    #ループ2 3 {% if a == x %} 4 {{b}} 5 {% if a != x and x in ['A003'] %} 6 {{0}} 7 {% endif %} 8 {% endfor %} 9{% endfor %}

投稿2018/12/05 06:40

編集2018/12/05 07:16
yamato_user

総合スコア2321

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

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

s-hara

2018/12/05 06:55

ご回答ありがとうございます。 わかりづらくもうしわけないです。 回答いただいたように else→{{0}}にしてしまうと、ループ1の各データに対してループ2を 回すごとに if a == xに合致しないと0がそのたびに表示されてしまいますが、実現したいのは、 この例のデータですと、ループ1でlist_data1='A003'の場合のループ2の処理時のみ{% if a == x %}に合致しなかった場合に{{0}}と表示させたいのです。 今思ったのですが、だったらテンプレート側で比較して以下のように0をセットさせるのが一番簡単なのかなと思いました・・ list_data1 = ['A001','A002','A003','A004'] list_data2 = [['A001','100'],['A002','200'],['A004','400']]            ↓ list_data1とlist_data2を比較して、list_data1にあってlist_data2にないA003について list_data2に値が0の要素を追加してしまう。 list_data1 = ['A001','A002','A003','A004'] list_data2 = [['A001','100'],['A002','200'],['A004','400'],[A003,'0']]
s-hara

2018/12/05 07:11

補足致します。 >この例のデータですと、ループ1でlist_data1='A003'の場合のループ2の処理時のみ{% if a == x %}に>合致しなかった場合に{{0}}と表示させたいのです。 上記の部分ですが、正確には「合致しなかった場合に1度だけ{{0}}と表示させたい」です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問