web-dev-qa-db-fra.com

Rendre un dict en python dans Jinja2/Werkzeug

Je joue avec un raccourcisseur d’URL (basé sur l’application de démonstration Bientôt de Werkzeug).

J'ai un dict comme ça - 

    ('1', {'target': 'http://10.58.48.103:5000/', 'clicks': '1'})
    ('3', {'target': 'http://slash.org', 'clicks': '4'})
    ('2', {'target': 'http://10.58.48.58:5000/', 'clicks': '1'})
    ('5', {'target': 'http://de.com/a', 'clicks': '0'})

qui est retourné dans url_list et utilisé par render_template

def on_list_urls(self, request):
    url_list = self.get_urls()
    return self.render_template('list_urls.html',
        url_list = url_list
    )

le template list_urls est assez simple - 

    {% extends "layout.html" %}
    {% block title %}List URLs{% endblock %}
    {% block body %}
      <h2>List URLs</h2>
      <ul id="items">
      {% for item in url_list %}
        <li>{{ item }}</li>
      {% endfor %}
      </ul>

    {% endblock %}

Le problème est que je n'arrive pas à accéder aux éléments du dict. 

La ligne 

<li>{{ item }}</li>

c’est là que je concentre mon attention. Comme ci-dessus, je reçois une liste des clés dans le dict.

<li>{{ item["target"] }}</li>

ne renvoie rien. Aucun des {{user.url}} "> {{user.username}} Les éléments de type dans la documentation semblent fonctionner.

Des idées s'il vous plaît? Débutant - soyez doux. Merci.

Mettre à jour

Merci pour les réponses. 

La réponse d'Ewan fonctionne, mais utilise une liste de dict. Je veux passer un dict et le rendre (parce que je veux un index d'éléments non entiers). Est-ce que Jinja fait ça?

Aussi - j'ai mal représenté url_list. C'est plus comme ça - 

{'a': {'target': 'http://testing.com/test', 'clicks': '0'}, 
'1': {'target': 'http://10.58.48.103:5000/', 'clicks': '1'}, 
'3': {'target': 'http://slash.org', 'clicks': '4'}, 
'2': {'target': 'http://10.58.48.58:5000/', 'clicks': '1'}}

Expérimentation supplémentaire - passer un dict génère une erreur concernant un objet de la liste.

   {% for key in url_list.iteritems() %}

    UndefinedError: 'list object' has no attribute 'iteritems'

Merci encore.

Je suis toujours déconcerté par les raisons pour lesquelles il pensait que je passais une liste mais que cela fonctionnait maintenant.

{% for key, value in url_list.iteritems() %}
    <li>{{ key }} - {{ value["target"] }} - {{ value["clicks"] }}</li>

affiche tout. Merci beaucoup.

20
user2839288

Votre url_list devrait ressembler à ceci:

url_list = [{'target': 'http://10.58.48.103:5000/', 'clicks': '1'}, 
            {'target': 'http://slash.org', 'clicks': '4'},
            {'target': 'http://10.58.48.58:5000/', 'clicks': '1'},
            {'target': 'http://de.com/a', 'clicks': '0'}]

Puis en utilisant:

<li>{{ item["target"] }}</li> 

dans votre modèle fonctionnera.

Modifier 1:

Votre modèle pense que vous passez une liste, alors êtes-vous sûr de transmettre votre dict d'origine et non la liste ci-dessus?

De plus, vous devez accéder à une key et à une value dans votre dictionnaire (lorsque vous passez un dictionnaire plutôt qu'une liste): 

Python 2.7

{% for key, value in url_list.iteritems() %}
    <li>{{ value["target"] }}</li> 
{% endfor %}

Python 3

{% for key, value in url_list.items() %}
    <li>{{ value["target"] }}</li> 
{% endfor %}
25
Ewan

Veuillez noter que la méthode dict.items() existe à la fois dans Python 2 et Python 3. Toutefois, la méthode ne donne aucune garantie quant aux éléments de commande contenus dans le dictionnaire qui sont itérés. C'est pourquoi il serait plus logique que cet exemple utilise une liste de dictionnaires au lieu d'un dictionnaire de dictionnaires, comme vous l'avez dit plus haut.

0
Federico Ressi