ChatGPT解决这个技术问题 Extra ChatGPT

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

C
Community

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.


Be careful with blocktrans, it doesn't allow dot notation. {% blocktrans with json.key1 as mykey %} {{ mykey }} {% endblocktrans %}
M
Micah Walter

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

also from there, I use .get so that if the key is absent, it returns none. If you do dictionary[key] it will raise a KeyError then
R
River

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'


E
Edouard Thiel

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