¿Cómo puedo devolver una lista como una variable en Python y su uso en Jinja2?

StackOverflow https://stackoverflow.com/questions/3970420

  •  09-10-2019
  •  | 
  •  

Pregunta

Soy un programador muy joven y yo estoy tratando de hacer algo en Python, pero estoy atascado. Tengo una lista de usuarios en couchdb (usando la biblioteca de Python y couchdb marco frasco) que tienen un nombre de usuario (que es _ID) y correo electrónico. Quiero usar la lista de direcciones de correo electrónico en un cuadro de selección en una plantilla Jinja2.

Mi primer problema es cómo acceder a las direcciones de correo electrónico. Si hago:

for user in db:
    doc = db[user]
    emails = doc['email']
    print options

Puedo obtener:

email@domain.com
otheremail@otherdomain.com
yetanotheremail@yetanotherdomain.com

Así que puedo conseguir mi lista de correos electrónicos. Pero en mi inexperiencia brutal está apareciendo es que no sé cómo entonces usarlos. La lista sólo existe en el bucle. ¿Cómo puedo devolver esa lista como una lista útil de las variables? Y cómo lo hago a continuación, la lista aparece en mi plantilla Jinja2 en un desplegable opción. Me parece que necesito una función pero yo soy un programador verde.

¿Podría por lo aprecian ayuda.

¿Fue útil?

Solución

Asumiendo que tiene un modelo como:

class User(Document):
    email = TextField()

Se puede utilizar el método load estático de la clase de usuarios

users = [User.load(db, uid) for uid in db]

Ahora usted puede hacer esto:

for user in users:
    print user.id, user.email  

Pero se está usando en un matraz así, en su opinión, puede enviar esta lista de usuarios a su plantilla con algo como esto:

from flask import render_template
@app.route("/users")
def show_users():
    users = [User.load(db, uid) for uid in db]
    return render_template('users.html', users=users)

Ahora en la plantilla users.html Jinja2 la siguiente es la salida de un cuadro de lista desplegable de cada usuario de correo electrónico

<select>
{% for user in users %}
    <option value="{{ user.id }}">{{ user.email }}</option>
{% endfor %}
</select>

Además, se está utilizando la extensión matraz de CouchDB? Podría ser útil en la abstracción de algo de la baja couchdb nivel de codificación: http: //packages.python. org / matraz de CouchDB /

Renuncia: El código anterior no ha sido probado, pero debería funcionar bien. No sé mucho sobre CouchDB, pero estoy familiarizado con el frasco. También, obviamente, no incluyó una solicitud completa Frasco / CouchDB aquí, así bits de código faltan.

Otros consejos

Se pasa parámetros para una plantilla de jinja como d diccionario cuando se llama a la función template.renderfunction(d) (por ejemplo). De este modo, se podría hacer:

emails = []
for user in db:
    doc = db[user]
    emails.append(doc['email'])
some_jinja_template.render({'list_of_emails' : emails})

A continuación, en la plantilla, usted podría hacer algo como:

<ul>
{% for address in list_of_emails %}
    <li><a href="mailto:{{ address }}">Send email to {{ address }}</a></li>
{% endfor %}
</ul>

Para hacer una lista de correos electrónicos, por ejemplo, o manejarlos sin embargo lo desea.

PS -. Estoy seguro de que el código podría ser más elegante / más optimizado con una lista por comprensión o lo que sea, pero que pensé que debería hacer hincapié en la legibilidad para un programador llamado "verde"

lista = [ x for x in db ] # watch out for big databases, you can run out of memory
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top