2010-10-19 6 views
9

Sono un programmatore molto giovane e sto cercando di fare qualcosa in Python ma sono bloccato. Ho una lista di utenti in Couchdb (usando la libreria python couchdb & framework Flask) che hanno un nome utente (che è il _id) ed e-mail. Voglio utilizzare l'elenco di indirizzi e-mail in una casella di selezione in un modello jinja2.Come posso restituire una lista come variabile in Python e usarla in Jinja2?

Il mio primo problema è come accedere agli indirizzi email. Se faccio:

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

ottengo:

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

modo da poter ottenere la mia lista dei messaggi di posta elettronica. Ma dove si manifesta la mia brutale inesperienza è che non so come usarli. L'elenco esiste solo nel ciclo for. Come posso restituire quell'elenco come una lista di variabili utilizzabili? E come faccio quindi a visualizzare quell'elenco nel mio modello jinja2 in un menu a discesa delle opzioni. Credo di aver bisogno di una funzione, ma sono un programmatore verde.

Sarebbe molto gradito.

risposta

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) 

Ora nel vostro template Jinja2 users.html il seguente output volontà una casella di riepilogo a discesa di e-mail di ciascun utente

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

Inoltre, si sta utilizzando l'estensione Flask-CouchDB? Potrebbe essere utile per astrarre alcuni dei codici a basso livello CouchDB: http://packages.python.org/Flask-CouchDB/

Disclaimer: Le codice di cui sopra non è stato testato, ma dovrebbe funzionare bene. Non so molto di CouchDB, ma ho familiarità con Flask. Inoltre, ovviamente non ho incluso un'applicazione completa Flask/CouchDB qui, quindi mancano bit di codice.

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

-1: 'list' è un nome di variabile terribile. Una delle peggiori scelte possibili. –

+0

@ S.Lott: anzi, grazie per il -1. –

3

Si passano i parametri a un modello jinja come dizionario d quando si chiama la funzione template.renderfunction(d) (ad esempio). Così, si potrebbe fare:

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

Poi nel modello, si potrebbe fare qualcosa di simile:

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

Per fare un elenco di messaggi di posta elettronica, per esempio, o di gestire comunque vuoi.

PS - Sono sicuro che il codice potrebbe essere più elegante/ottimizzato con una comprensione di lista o qualsiasi altra cosa, ma ho pensato che dovrei enfatizzare la leggibilità per un programmatore cosiddetto "verde".