Le rendu d'un python dict en Jinja2 / Werkzeug
Je suis en train de jouer avec un raccourcisseur d'url (en se basant sur le Peu de démonstration d'application de Werkzeug).
J'ai un dict, ce
('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 modèle 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 %}
Truc, c'est que je n'arrive pas à accéder aux éléments dans le dict.
La ligne
<li>{{ item }}</li>
est là que je me suis concentrer l'attention. Comme ci-dessus, j'obtiens la liste des clés dans le dict.
<li>{{ item["target"] }}</li>
ne retourne rien. Aucun des
{{ utilisateur.url }}">{{ utilisateur.nom d'utilisateur }}
type de trucs dans les docs semble fonctionner.
Des idées s'il vous plaît? Débutant - être doux. Merci.
Mise à jour
Merci pour les réponses.
Ewan la réponse de travaux, mais utilise une liste de dicts. Je veux passer un dict et un rendu (parce que je veux un non-entier index des articles). Ne Jinja faire?
Aussi - je mal représenté url_list. C'est plus comme ce -
{'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'}}
Poursuite de l'expérimentation - le passage d'un dict produit une erreur à propos d'un objet de la liste.
{% for key in url_list.iteritems() %}
UndefinedError: 'list object' has no attribute 'iteritems'
Merci encore.
Encore perplexes par pourquoi il pensait que j'était en train de passer d'une liste, mais il a obtenu ce travail maintenant.
{% for key, value in url_list.iteritems() %}
<li>{{ key }} - {{ value["target"] }} - {{ value["clicks"] }}</li>
imprime tout. Merci beaucoup.
- Qui ne ressemble pas à une dict à moi...C'est une liste de tuples avec les dicts que le deuxième élément.
Vous devez vous connecter pour publier un commentaire.
Votre
url_list
devrait ressembler à ceci:Ensuite à l'aide d':
dans votre modèle de travail.
Edit 1:
Votre modèle pense que vous êtes en passant une liste, de sorte que vous êtes sûr que vous êtes de passage dans votre original dict et non de ma liste ci-dessus?
Aussi, vous devez accéder à la fois à un
key
et unvalue
dans votre dictionnaire (quand vous êtes en passant un dictionnaire plutôt qu'une liste):Python 2.7
Python 3
url_list.iteritems
seraiturl_list.items()
(et vous avez besoin des parenthèses pour l'appeler).Veuillez noter que
dict.items()
méthode existe en Python 2 et Python 3. Mais la méthode ne donne aucune garantie quant à l'ordre des éléments contenus dans le dictionnaire sont itérée. C'est pourquoi il pourrait faire plus de sens pour cet exemple d'utiliser une liste de dictionnaires au lieu d'un dictionnaire de dictionnaires comme vous l'avez dit ci-dessus.Une approche consiste à séparer proprement logique de traitement de l'HTML. Ainsi, mettre du HTML dans un fichier séparé, tels que,
top.reddit.html
. Mais le contenu à l'intérieur de l'HTML dynamique depuis qu'il est sorti de Reddit. Nous utilisons donc des Jinja2 que le moteur de template. Cela implique quetop.reddit.html
est juste le modèle mais pas le contenu final pour être servi.top.reddit.html (ne montrant que la dynamique des lignes ici par souci de concision):
Code Python pour rendre le modèle (testé avec Python 3.5.6, Jinja2 2.10):