ビューからテンプレートに辞書を渡しています。しかし、特定のキー、例えばjson.items["key1":"value1":"value2"}`から直接ビューにアクセスするという優雅な解決策は見あたりません。if/then文を使うこともできますが、むしろ直接アクセスしたいのですが、何か方法はありますか?
以下は、htmlテンプレート内のループコードです:
{% for key, value in json.items %}
<li>{{key}} - {{value}}</li>
{% endfor %}
Django テンプレート言語では、次のように辞書のキーを調べることをサポートしています:
{{ json.key1 }}
変数とルックアップ]1については、テンプレートのドキュメントを参照してください。
テンプレート言語では、json[key]
(key
は変数)を表示する方法は提供されていません。このStack Overflowの質問の回答で提案されているように、これを行うためのテンプレート・フィルタを書くことができます。
例えば、以下のような辞書を送信する場合
dict = {'name':'myname','number':'mynumber'}
views :
return render(request, self.template_name, {'dict': dict})
.
htmlテンプレートで値をレンダリングする場合:
<p>{{ dict.name }}</p>
)
と表示されます。
この問題を解決するために、次のようなことを試してみてはいかがでしょうか:
def get_context_data(self, **kwargs):
context['cart'] = []
cart = Cart()
cart.name = book.name
cart.author = book.author.name
cart.publisher = book.publisher.name
cart.price = 123
cart.discount = 12
cart.total = 100
context['cart'].append(cart)
return context
class Cart(object):
"""
Cart Template class
This is a magic class, having attributes
name, author, publisher, price, discount, total, image
You can add other attributes on the fly
"""
pass
By this way you can access your cart something like this:
{% for item in cart %}
<div class="jumbotron">
<div>
<img src="{{item.image}}" />
<div class="book_name"> <b>{{item.name}}</b></div>
<div class="book_by"><i>{{item.author}}</i></div>
<span>Rs. {{item.price}}</span> <i>{{item.discount}}% OFF </i>
<b>Rs. {{item.total}}</b>
{% endfor %}
@Alasdairが示唆するように、テンプレートフィルターを使用できます。
templatetags
ディレクトリに、次のファイル dict_key.py
を作成します。
from django.template.defaultfilters import register
@register.filter(name='dict_key')
def dict_key(d, k):
'''Returns the given key from a dictionary.'''
return d[k]
次に、HTMLで次のように記述できます。
{% for k in json.items %}
<li>{{ k }} - {{ json.items|dict_key:k }}</li>
{% endfor %}