python - saber - Acceso al diccionario por clave en la plantilla de Django
declarar un diccionario python (4)
Estoy pasando un diccionario de mi vista a una plantilla. Así que {"key1":"value1","key2":"value2"}
se pasa y al pasar por la clave, los pares de valores están bien, sin embargo, no he encontrado una solución elegante para acceder directamente en la vista desde una clave específica , diga "key1"
por ejemplo bu json.items ["key1"]. Podría usar algunas declaraciones if / then, pero preferiría hacerlo directamente, ¿hay alguna manera?
Aquí está el código de bucle en la plantilla html:
{% for key, value in json.items %}
<li>{{key}} - {{value}}</li>
{% endfor %}
Como sugiere @Alasdair, puede usar un filtro de plantilla. En su directorio templatetags
, cree el siguiente archivo 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]
Luego, en tu HTML, puedes escribir:
{% for k in json.items %}
<li>{{ k }} - {{ json.items|dict_key:k }}</li>
{% endfor %}
El lenguaje de plantilla de Django permite buscar las claves del diccionario de la siguiente manera:
{{ json.key1 }}
Consulte los documentos de plantilla sobre variables y búsquedas .
El lenguaje de plantilla no proporciona una forma de mostrar json[key]
, donde la key
es una variable. Puede escribir un filtro de plantilla para hacer esto, como se sugiere en las respuestas a esta pregunta sobre desbordamiento de pila .
Para superar este problema, podrías 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 %}
Por ejemplo, para enviar el diccionario siguiente dict = {''name'':''myname'',''number'':''mynumber''}
vistas: return render(request, self.template_name, {''dict'': dict})
Para representar el valor en la plantilla html: <p>{{ dict.name }}</p>
Imprime ''myname''