2010-05-24 10 views
41

Me gustaría usar una variable como clave en un diccionario en una plantilla de Django. No puedo, por la vida de mí, descubrir cómo hacerlo. Si tengo un producto con un campo de nombre o identificación, y las clasificaciones de diccionario con los índices de los ID de producto, me gustaría ser capaz de decir:Usar la variable como clave de diccionario en la plantilla de Django

{% for product in product_list %} 
    <h1>{{ ratings.product.id }}</h1> 
{% endfor %} 

en Python esto se logra con un simple

ratings[product.id] 

Pero no puedo hacer que funcione en las plantillas. He intentado usarlo con ... sin dados. Ideas?

+0

posible duplicado de [cómo acceder al elemento del diccionario en la plantilla django?] (Http://stackoverflow.com/questions/1275735/how-to-access-dictionary-element-in-django-template) – Anto

Respuesta

16

Es necesario preparar sus datos de antemano, en este caso debe pasar lista de-dos tuplas a su plantilla:

{% for product, rating in product_list %} 
    <h1>{{ product.name }}</h1><p>{{ rating }}</p> 
{% endfor %} 
+0

Gracias cji! Estaba tratando de evitar otro objeto, pero en realidad no importa ... de todos modos está en la memoria caché. – CaptainThrowup

+1

No necesita preparar los datos en la vista, puede lograr lo mismo al llamar a 'items' en el diccionario que ya está en el contexto -' {% para product, rating in product_list.items%} ' trabajo. – jhrr

72

crear una etiqueta de plantilla como esta (en YourProject/templatetags):

@register.filter 
def keyvalue(dict, key):  
    return dict[key] 

Uso:

{{dictionary|keyvalue:key_variable}} 
+2

También necesita un montón de cosas periféricas para que esto funcione, así que asegúrese de revisar la documentación: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/ –

+1

¿Se puede encadenar esto para dictados anidados? Algo como '{{dictionary | keyvalue: key_variable | keyvalue: another_key}}'? –

+0

En teoría, sí, pruébelo;) – eviltnan

12

Hay una muy sucio solución:

<div>We need d[{{ k }}]</div> 

<div>So here it is: 
{% for key, value in d.items %} 
    {% if k == key %} 
     {{ value }} 
    {% endif %} 
{% endfor %} 
</div> 
7

Sobre la base de la respuesta de eviltnan, su filtro se lanza una excepción si key no es una clave de dict.

Los filtros nunca deben generar excepciones, pero deben fail gracefully. Esta es una respuesta más robusta/completo:

@register.filter 
def keyvalue(dict, key):  
    try: 
     return dict[key] 
    except KeyError: 
     return '' 

Básicamente, esto sería hacer lo mismo que en dict.get(key, '') código Python, y también se podría escribir de esa manera si no se desea incluir el bloque try/except, aunque es más explícito.

+9

en lugar de dict [clave], solo usa el método de obtención de diccionario integrado python. Por ejemplo: return dict.get (key, '') – user772401

Cuestiones relacionadas