2010-10-19 21 views
9

Soy un programador muy joven y estoy tratando de hacer algo en Python, pero estoy atascado. Tengo una lista de usuarios en Couchdb (utilizando python couchdb library & Flask framework) que tienen un nombre de usuario (que es _id) y un correo electrónico. Quiero usar la lista de direcciones de correo electrónico en un cuadro de selección en una plantilla de jinja2.¿Cómo devuelvo una lista como una variable en Python y uso en 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 

me sale:

[email protected] 
[email protected] 
[email protected] 

para que pueda obtener mi lista de correos electrónicos. Pero donde está apareciendo mi brutal inexperiencia es que no sé cómo usarlas. La lista solo existe en el ciclo for. ¿Cómo devuelvo esa lista como una lista utilizable de variables? ¿Y cómo puedo hacer que esa lista aparezca en mi plantilla de jinja2 en un menú desplegable de opciones? Supongo que necesito una función, pero soy un programador ecológico.

Lo agradecería mucho la ayuda.

Respuesta

15
# assuming you have something such as this: 
class User(Document): 
    email = TextField() 

# you can use the .load() method of the User class 
users = [User.load(db, uid) for uid in db] 

# now you can do this: 
for user in users: 
    print user.id, user.email 

# but you're using it in flask so, in your view you can send 
# this list of users to your template using something like this: 

from flask import render_template 
@app.route("/users") 
def show_users(): 
    return render_template('users.html', users=users) 

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

<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 para abstraer algunos de los códigos de sofá de bajo nivel: http://packages.python.org/Flask-CouchDB/

Descargo de responsabilidad: El código anterior no fue probado, pero debería funcionar bien. No sé mucho sobre CouchDB, pero estoy familiarizado con Flask. Además, obviamente no incluí una aplicación completa de Flask/CouchDB aquí, por lo que faltan fragmentos de código.

1
lista = [ x for x in db ] # watch out for big databases, you can run out of memory 
+6

-1: 'list' es un nombre de variable horrible. Una de las peores elecciones posibles. –

+0

@ S.Lott: de hecho, gracias por el -1. –

3

Pasa los parámetros a una plantilla jinja como diccionario d cuando 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}) 

Luego, en la plantilla, se 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.

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

Cuestiones relacionadas