2010-05-24 15 views
41

Vorrei utilizzare una variabile come chiave in un dizionario in un modello Django. Non posso per la vita di me capire come farlo. Se ho un prodotto con un nome o un ID campo e feedback dizionario con indici delle ID prodotto, mi piacerebbe poter dire:Utilizza la variabile come chiave del dizionario nel modello Django

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

in Python questo sarebbe essere realizzato con un semplice

ratings[product.id] 

Ma non riesco a farlo funzionare nei modelli. Ho provato a usare con ... senza dadi. Idee?

+0

possibile duplicato di [come accedere all'elemento del dizionario nel modello django?] (Http://stackoverflow.com/questions/1275735/how-to-access-dictionary-element-in-django-template) – Anto

risposta

16

È necessario preparare i dati in anticipo, in questo caso si dovrebbe passare lista di due-tuple al modello:

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

Grazie cji! Stavo cercando di evitare un altro oggetto, ma non importa davvero ... è tutto in cache comunque. – CaptainThrowup

+1

Non è necessario preparare i dati nella vista, è possibile ottenere la stessa cosa chiamando 'items' sul dizionario che è già nel contesto -' {% per prodotto, valutazione in product_list.items%} ' lavoro. – jhrr

72

creare un tag modello come questo (in ProgettoUtente/templatetags):

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

Usage:

{{dictionary|keyvalue:key_variable}} 
+2

Hai anche bisogno di un po 'di materiale periferico per fare questo lavoro, quindi assicurati di controllare la documentazione: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/ –

+1

Può essere concatenato per dotti annidati? Qualcosa come '{{dictionary | keyvalue: key_variable | keyvalue: another_key}}'? –

+0

Teoricamente sì, provalo;) – eviltnan

12

C'è un molto sporco Soluzione:

<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

Sulla risposta di eviltnan, il suo filtro sollevare un'eccezione se key non è una chiave di dict.

I filtri non devono mai generare eccezioni, ma dovrebbero essere fail gracefully. Si tratta di un più robusto/risposta completa:

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

Fondamentalmente, questo avrebbe fatto la stessa dict.get(key, '') in codice Python, e potrebbe anche essere scritta in questo modo se non si desidera includere il blocco try/except, anche se è più esplicito.

+9

invece di dict [chiave] devi solo usare il metodo del dizionario python integrato. ad esempio: return dict.get (key, '') – user772401

Problemi correlati