Django テンプレートでキーによる辞書へのアクセス

ビューからテンプレートに辞書を渡しています。しかし、特定のキー、例えば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の質問の回答で提案されているように、これを行うためのテンプレート・フィルタを書くことができます。

解説 (1)

例えば、以下のような辞書を送信する場合 dict = {'name':'myname','number':'mynumber'}

views : return render(request, self.template_name, {'dict': dict}).

htmlテンプレートで値をレンダリングする場合: <p>{{ dict.name }}</p>)

と表示されます。

解説 (0)

この問題を解決するために、次のようなことを試してみてはいかがでしょうか:

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>

    <div class="book_name"> {{item.name}}</div>
    <div class="book_by">{{item.author}}</div>
    <span>Rs. {{item.price}}</span> {{item.discount}}% OFF 
    Rs. {{item.total}}
{% endfor %}
解説 (0)

@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 %}
解説 (1)