web-dev-qa-db-ja.com

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

辞書をビューからテンプレートに渡します。そう {"key1":"value1","key2":"value2"}が渡され、キーをループします。値のペアは問題ありませんが、"key1"たとえばbu json.items ["key1"]。いくつかのif/thenステートメントを使用できますが、直接方法がありますか?

Htmlテンプレートのループコードは次のとおりです。

{% for key, value in json.items %} 
  <li>{{key}} - {{value}}</li>
 {% endfor %}
48
disruptive

Djangoテンプレート言語は、次のように辞書キーの検索をサポートしています。

{{ json.key1 }}

変数とルックアップ のテンプレートドキュメントを参照してください。

テンプレート言語は、json[key]を表示する方法を提供しません。ここで、keyは変数です。 Stack Overflow question の回答で提案されているように、これを行うテンプレートフィルターを作成できます。

70
Alasdair

たとえば、以下の辞書_dict = {'name':'myname','number':'mynumber'}_を送信するには

ビュー:return render(request, self.template_name, {'dict': dict})

HTMLテンプレートで値をレンダリングするには:_<p>{{ dict.name }}</p>_

_'myname'_を出力します

5

@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 %}
4
Micah Walter

この問題を克服するには、次のようなものを試すことができます。

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 %}
4
Deepak Verma