Je passe un dictionnaire de mon point de vue à un modèle. Alors {"key1":"value1","key2":"value2"}
est passé et passe en boucle dans la clé, les paires de valeurs vont bien, mais je n’ai pas trouvé de solution élégante pour accéder directement à la vue à partir d’une clé spécifique, disons "key1"
_ par exemple bu json.items ["key1"]. Je pourrais utiliser certaines déclarations si/alors, mais je préférerais le faire directement, existe-t-il un moyen?
Voici le code en boucle dans le modèle html:
{% for key, value in json.items %}
<li>{{key}} - {{value}}</li>
{% endfor %}
Le langage de modèle Django permet de rechercher les clés de dictionnaire comme suit:
{{ json.key1 }}
Voir la documentation du modèle sur variables et recherches .
Le langage de template ne permet pas d’afficher json[key]
, où key
est une variable. Pour ce faire, vous pouvez écrire un filtre modèle, comme suggéré dans les réponses à cette question Stack Overflow .
Par exemple, pour envoyer le dictionnaire ci-dessous dict = {'name':'myname','number':'mynumber'}
vues: return render(request, self.template_name, {'dict': dict})
Pour rendre la valeur dans un modèle HTML: <p>{{ dict.name }}</p>
Il imprime 'myname'
Comme @Alasdair le suggère, vous pouvez utiliser un filtre de modèle. Dans votre répertoire templatetags
, créez le fichier suivant dict_key.py
:
from Django.template.defaultfilters import register
@register.filter(name='dict_key')
def dict_key(d, k):
'''Returns the given key from a dictionary.'''
return d[k]
Ensuite, dans votre code HTML, vous pouvez écrire:
{% for k in json.items %}
<li>{{ k }} - {{ json.items|dict_key:k }}</li>
{% endfor %}
Pour surmonter ce problème, vous pouvez essayer quelque chose comme ceci:
def get_context_data(self, **kwargs):
context['cart'] = []
cart = Cart()
cart.name = book.name
cart.author = book.author.name
cart.publisher = book.publisher.name
cart.price = 123
cart.discount = 12
cart.total = 100
context['cart'].append(cart)
return context
class Cart(object):
"""
Cart Template class
This is a magic class, having attributes
name, author, publisher, price, discount, total, image
You can add other attributes on the fly
"""
pass
By this way you can access your cart something like this:
{% for item in cart %}
<div class="jumbotron">
<div>
<img src="{{item.image}}" />
<div class="book_name"> <b>{{item.name}}</b></div>
<div class="book_by"><i>{{item.author}}</i></div>
<span>Rs. {{item.price}}</span> <i>{{item.discount}}% OFF </i>
<b>Rs. {{item.total}}</b>
{% endfor %}