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

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

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

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

Q&A

解決済

2回答

619閲覧

pythonでならcount[user['id']]で表示できるものを、template側で{{ count.user.id }}と書くとエラー

monnmomo

総合スコア3

Django

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

0グッド

0クリップ

投稿2021/10/23 07:06

編集2021/10/23 07:14

前提・実現したいこと

djangoのtemplate側で、辞書の中身を取り出したいのですが出来ません。valueを取り出すために、keyとして他の辞書のvalueを使おうとするのですが、何も表示されません。書き方の問題だと思うのですが、調べ方が分からず解決できなかったのでお教え頂ければ幸いです。

該当のソースコード

templateで、{{ count.user.id }}と書いた箇所が反映されず困っています。pythonでならcount[user['id']]のような形で取り出せるのですが、htmlでの書き方が分かりません。

models.py

python

1class User(models.Model): 2 name = models.CharField( 3 verbose_name='名前', 4 max_length=20, 5 blank=False, 6 null=False 7 ) 8 def __str__(self): 9 return self.name

views.py

python

1users = User.objects.all.values() 2count = {1: 0, 2: 1} 3return render(request, '~.html', {'users':users, 'count': count}) 4

template

html

1 {% for user in users %} 2 {{ user.name }}</br> 3 {{ count.user.id }} 4 {% endfor %}

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

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

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

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

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

guest

回答2

0

ベストアンサー

Djangoの組み込みテンプレート(DTL)はcount.userを先に解決しようとするため、その時点でNoneになって何も表示されません。
また、()[]といった記述はDTLの文法に存在しないため、思いつく範囲だと次のような工夫が必要になってくると思います。

※もう少しスマートな解法があるかもしれませんが

1. テンプレートタグを自作する

「辞書オブジェクト」と「キーとなる値」を受け取れるようなテンプレートタグを用意して、
今回のようなやや込み入った参照パターンにはこれを利用する。

python

1# templatetags.py 2# ソースの引用元: https://stackoverflow.com/a/51090108/9600788 3from django.template.defaultfilters import register 4 5@register.filter(name='dict_key') 6def dict_key(d, k): 7 '''Returns the given key from a dictionary.''' 8 return d[k]

html

1{% for user in users %} 2 {{ user.name }}</br> 3 {{ count|dict_key:user.id}} 4{% endfor %}

テンプレートタグの使い方(実装・組み込み)などについては、Djangoのドキュメントを参照してください。

2. テンプレートエンジンをJinja2にする

別の方の回答にある通り、Jinja2はcount[]によるdictへのアクセスをサポートしています。
settings.pyなどのTEMPLATESで設定を変えたりは出来るので、ドキュメントを参照しつつJinja2を使うようにすれば、
count[user['id']]といった記述が可能かもしれません。

https://docs.djangoproject.com/en/3.2/ref/settings/#templates

3. (番外)countの内容をDjangoのモデルとして扱う

countが持つ構成要素を、dictではなくUserのプロパティなどや、リレーションシップを持つのモデルとして用意してあげれば、
このあたりのことを気にしなく出来る可能性はあります。 ※いくつか考えられるが省略
(もちろん、実現したいことの関係で今回のようにせざるを得ないこともあるので、どうにもならないことはあると思いますが)

投稿2021/10/23 11:05

attakei

総合スコア2738

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

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

0

追記

DjangoのテンプレートエンジンはJinja2だと思いこんでいましたが、違いました。
失礼しました。

何かの役に立つかもしれないので、以下に過去の回答を残しておきます。

過去の回答

DjangoのテンプレートエンジンJinja2でdictの要素にアクセスするにはd[key]と書くこともできます。

Variables | Template Designer Documentation - Jinja Documentation

jinja2

1{% for user in users %} 2 {{ user.name }}</br> 3 {{ count[user.id] }} 4{% endfor %}

d.keyd['key']と同じなので、count.user.idcount['user']['id']と同じになります。

投稿2021/10/23 09:51

編集2021/10/23 11:26
fj68

総合スコア752

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問