mydict = {"key1":"value1", "key2":"value2"}
La façon régulière à rechercher une valeur dictionnaire dans un modèle Django est {{ mydict.key1 }}
, {{ mydict.key2 }}
. Et 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égler ceci?
Récupérez à la fois la clé et la valeur du dictionnaire dans la boucle:
Je trouve cela plus facile à lire et cela évite d'avoir besoin d'un codage spécial. J'ai généralement besoin de la clé et de la valeur à l'intérieur de la boucle.
la source
Vous ne pouvez pas par défaut. Le point est le séparateur / déclencheur de la recherche d'attribut / recherche de clé / tranche.
Mais vous pouvez créer un filtre qui vous permet de passer un argument:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
la source
return value.get(arg)
J'emploierais toujours parce que cela ne lèverait pas une exception KeyError si la clé n'est pas présente.Pour moi, la création d'un fichier python nommé
template_filters.py
dans mon application avec le contenu ci-dessous a fait le travaill'usage est comme ce que culebrón a dit:
la source
register = Library()
? Qu'est ce que ça fait ?django.template.base.Library
classe. parregister = Library()
nous instancions cette classe et utilisonsfilter
l'annotateur de fonction à l'intérieur pour atteindre notre besoin.J'avais 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 du dictionnaire. Dans le modèle, j'utilise ensuite la propriété.
Dans mon modèle: -
Dans mon modèle: -
la source
Comme je ne peux pas commenter, permettez-moi de le faire sous la forme d'une réponse:
pour s'appuyer sur la réponse de culebrón ou sur la réponse de Yuji 'Tomita' Tomita , le dictionnaire passé dans la fonction est sous la forme d'une chaîne, alors utilisez peut-être ast. literal_eval pour convertir d'abord la chaîne en dictionnaire, comme dans cet exemple .
Avec cette modification, le code devrait ressembler à ceci:
la source
Environnement: Django 2.2
J'ai mis ce code dans un fichier nommé template_filters.py dans mon dossier de projet nommé portfoliomgr
Peu importe où vous placez votre code de filtre, assurez-vous que vous avez __init__.py dans ce dossier
Ajoutez ce fichier à la section des bibliothèques dans la section des modèles de votre fichier projectfolder / settings.py. Pour moi, c'est portfoliomgr / settings.py
Dans votre code html chargez la bibliothèque
la source
env: django 2.1.7
vue:
modèle:
la source
{{ dict_obj.obj.obj_name }}
est dans ce cas équivalent au code Pythondict_obj["obj"]["obj_name"]
, cependant, la question concerne l'équivalent dedict_obj[obj][obj_name]
.