odd get_template even async python werkzeug jinja2

get_template - Representación de un dict de python en Jinja2/Werkzeug



jinja2 list (2)

Tenga en cuenta que el método dict.items() existe tanto en Python 2 como en Python 3. Pero el método no ofrece garantías sobre el orden en que se están iterando los artículos contenidos en el diccionario. Esta es la razón por la que podría tener más sentido que este ejemplo use una lista de diccionarios en lugar de un diccionario de diccionarios como usted dijo anteriormente.

Estoy jugando con un acortador de url (basándolo en la aplicación de demostración Shortly de Werkzeug).

Tengo un dictado como este ...

(''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''})

que se devuelve en url_list y es usado por render_template

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

La plantilla list_urls es bastante 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 %}

La cosa es que parece que no puedo acceder a los elementos en el dict.

La línea

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

Es donde me estoy centrando la atención. Como arriba, obtengo una lista de las claves en el dict.

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

no devuelve nada. Ninguno de los elementos de tipo {{user.url}} "> {{user.username}} en la documentación parece funcionar.

Ideas por favor? Newbie - se amable. Gracias.

Actualizar

Gracias por las respuestas.

La respuesta de Ewan funciona, pero usa una lista de dictados. Quiero pasar un dictado y renderizar eso (porque quiero un índice de elementos no entero). ¿Jinja hace eso?

También - representé mal a url_list. Es más como esto ...

{''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''}}

Experimentación adicional: pasar un dict produce un error sobre un objeto de lista.

{% for key in url_list.iteritems() %} UndefinedError: ''list object'' has no attribute ''iteritems''

Gracias de nuevo.

Todavía desconcertado por la razón por la que pensaba que estaba pasando una lista, pero ahora funciona.

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

imprime todo. Muchas gracias.


Tu url_list debería verse así:

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''}]

Luego usando:

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

en tu plantilla funcionará

Edición 1:

Su plantilla cree que está pasando una lista, ¿está seguro de que está pasando su dictamen original y no mi lista anterior?

También necesita acceder tanto a una key como a un value en su diccionario (cuando pasa un diccionario en lugar de una lista):

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