Estoy pasando un diccionario de mi vista a una plantilla. Así que {"key1":"value1","key2":"value2"}
se pasa en y el bucle a través de pares clave,valor está bien, sin embargo I've no encontrado una solución elegante de acceso directamente en la vista de una clave específica, digamos "key1"
por ejemplo bu json.items["key1"]. Podría usar algunas sentencias if/then, pero prefiero hacerlo directamente ¿hay alguna forma?
Aquí está el código de bucle en la plantilla html:
{% for key, value in json.items %}
<li>{{key}} - {{value}}</li>
{% endfor %}
El lenguaje de plantillas de Django permite buscar claves de diccionario de la siguiente manera:
{{ json.key1 }}
Véase la documentación de plantillas sobre variables y búsquedas.
El lenguaje de plantillas no proporciona una forma de mostrar json[key]
, donde key
es una variable. Puede escribir un filtro de plantilla para hacer esto, como se sugiere en las respuestas a esta pregunta Stack Overflow.
Por ejemplo, para enviar el siguiente diccionario
dict = {'name':'myname','number':'mynumber'}
vistas:
return render(request, self.template_name, {'dict': dict})
Para renderizar el valor en plantilla html:
<p>{{ dict.name }}</p>
Imprime 'minombre'
.
Para superar este problema, puedes intentar algo como esto:
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 %}