web-dev-qa-db-fra.com

Accéder au dictionnaire par clé Django template

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 %}
48
disruptive

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 .

70
Alasdair

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'

5
Nandhitha Ramaraj

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 %}
4
Micah Walter

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 %}
4
Deepak Verma