Django template comment rechercher une valeur de dictionnaire avec une variable

mydict = {"key1":"value1", "key2":"value2"}

la façon régulière de chercher une valeur du dictionnaire dans un modèle Django est {{ mydict.key1 }} , {{ mydict.key2 }} . Si la clé est une variable de boucle? c'est à dire:

{% for item in list %} # where item has an attribute NAME
  {{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}

mydict.item.NAME échoue. Comment résoudre ce problème?

175
demandé sur MD. Khairul Basar 2011-11-03 22:26:37

5 réponses

Ecrire un filtre de modèle personnalisé:

from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

(j'utilise .get pour que si la clé est absente, elle ne renvoie aucune. Si vous faites dictionary[key] , il va soulever un KeyError alors.)

utilisation:

{{ mydict|get_item:item.NAME }}
274
répondu culebrón 2014-10-09 14:47:07

Chercher la clé et la valeur du dictionnaire dans la boucle:

{% for key, value in mydict.items %}
    {{ value }}
{% endfor %}

je trouve cela plus facile à lire et cela évite le besoin de codage spécial. J'ai généralement besoin de la clé et de la valeur à l'intérieur de la boucle de toute façon.

35
répondu Paul Whipp 2015-07-12 01:13:26

vous ne pouvez pas par défaut. Le point est le séparateur / déclencheur pour l'attribut de recherche / clé de recherche / tranche.

Les points

ont une signification particulière dans le rendu de gabarit. Un point dans une variable le nom signifie une recherche. Plus précisément, lorsque le système de gabarit rencontre un point dans un nom de variable, il essaye les recherches suivantes, dans cet ordre:

  • recherche dans le Dictionnaire. Exemple: foo ["bar"]
  • Attribut de recherche. Exemple: foo.bar
  • Liste de l'index de recherche. Exemple: foo [bar]

Mais vous pouvez faire un filtre qui vous permet de passer en argument:

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

@register.filter(name='lookup')
def lookup(value, arg):
    return value[arg]

{{ mydict|lookup:item.name }}
22
répondu Yuji 'Tomita' Tomita 2018-04-02 00:06:38

j'ai eu une situation similaire. Cependant, j'ai utilisé une solution différente.

dans mon modèle je crée une propriété qui fait la recherche de dictionnaire. Dans le modèle j'utilise alors la propriété.

dans mon modèle: -

@property
def state_(self):
    """ Return the text of the state rather than an integer """
    return self.STATE[self.state]

dans mon modèle: -

The state is: {{ item.state_ }}
1
répondu sexybear2 2016-10-07 00:39:55

pour moi créant un fichier python nommé template_filters.py dans mon application avec le contenu ci-dessous a fait le travail

# coding=utf-8
from django.template.base import Library

register = Library()


@register.filter
def get_item(dictionary, key):
    return dictionary.get(key)

l'usage est comme ce que culebrón a dit:

{{ mydict|get_item:item.NAME }}
1
répondu AmiNadimi 2017-06-29 19:12:06