disruptive
disruptive

Reputation: 5946

Accessing dictionary by key in Django template

I'm passing a dictionary from my view to a template. So {"key1":"value1","key2":"value2"} is passed in and looping through key,value pairs is fine, however I've not found an elegant solution from access directly in the view from a specific key, say "key1" for example bu json.items["key1"]. I could use some if/then statements, but I'd rather do directly is there a way?

Here is looping code in the html template:

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

Upvotes: 91

Views: 137439

Answers (4)

Micah Walter
Micah Walter

Reputation: 958

As @Alasdair suggests, you can use a template filter. In your templatetags directory, create the following file 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]

Then, in your HTML, you can write:

{% for k in json.items %} 
  <li>{{ k }} - {{ json.items|dict_key:k }}</li>
{% endfor %}

Upvotes: 23

Alasdair
Alasdair

Reputation: 308899

The Django template language supports looking up dictionary keys as follows:

{{ json.key1 }}

See the template docs on variables and lookups.

The template language does not provide a way to display json[key], where key is a variable. You can write a template filter to do this, as suggested in the answers to this Stack Overflow question.

Upvotes: 124

Nandhitha Ramaraj
Nandhitha Ramaraj

Reputation: 347

For example, to send the below dictionary dict = {'name':'myname','number':'mynumber'}

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

To render the value in html template: <p>{{ dict.name }}</p>

It prints 'myname'

Upvotes: 8

Deepak Verma
Deepak Verma

Reputation: 673

To overcome this problem you could try something like this:

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 %}

Upvotes: 5

Related Questions