web-dev-qa-db-fra.com

Utiliser une variable comme clé de dictionnaire dans le modèle Django

Je voudrais utiliser une variable comme clé dans un dictionnaire dans un modèle Django. Je ne peux pas pour la vie de moi-même comprendre comment le faire. Si j'ai un produit avec un nom ou un champ ID, et un dictionnaire de notes avec des indices des ID produits, je voudrais pouvoir dire:

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

En python cela se ferait avec un simple

ratings[product.id]

Mais je ne peux pas le faire fonctionner dans les modèles. J'ai essayé de l'utiliser avec ... pas de dés. Des idées?

54
CaptainThrowup

Vous devez préparer vos données à l'avance, dans ce cas, vous devez passer la liste de deux tuples à votre modèle:

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

Créez une balise de modèle comme celle-ci (dans vos balises project/templat):

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

Usage:

{{dictionary|keyvalue:key_variable}}
82
eviltnan

Il existe une solution très sale:

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

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

En s'appuyant sur la réponse d'Eviltnan, son filtre déclenchera une exception si key n'est pas une clé de dict.

Les filtres ne devraient jamais lever d'exceptions, mais devraient échouer gracieusement . Ceci est une réponse plus robuste/complète:

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

Fondamentalement, cela ferait la même chose que dict.get(key, '') dans Python, et pourrait également être écrit de cette façon si vous ne voulez pas inclure le bloc try/except, bien que c'est plus explicite.

9
Patrick