265 votes

Django modèle de la façon de rechercher un dictionnaire valeur à une variable

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

Manière régulière dictionnaire pour la recherche de valeur dans Django modèle 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 do dict lookup mydict[item.NAME]
{% endfor %}

mydict.item.NAME d'échec. Comment résoudre ce problème?

408voto

culebrón Points 5361

Écrire un modèle personnalisé de filtre:

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

(J'utilise .get , de sorte que si la clé est absente, elle renvoie none. Si vous n' dictionary[key] il va soulever une KeyError ensuite.)

utilisation:

{{ mydict|get_item:item.NAME }}

42voto

Yuji 'Tomita' Tomita Points 46106

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 spéciale dans le modèle de rendu. Un point dans une variable le nom signifie une recherche. En particulier, lorsque le système de template rencontres d'un point dans un nom de variable, il tente la suite de recherches, 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 cut(value, arg):
    return value[arg]

{{ mydict|lookup:item.name }}

-3voto

linqu Points 439

Je voudrais aller culebrón de la solution. Mais dans le cas où vous ne voulez pas écrire un modèle de filtre, vous pouvez également utiliser l' instruction:

{% with key=item.NAME %}
    {{ mydict.key }}
{% endwith %}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X