Come faccio a restituire una lista come una variabile in Python e uso in Jinja2?
Domanda
Sono una persona molto giovane programmatore e sto cercando di fare qualcosa in Python, ma mi sono bloccato. Ho una lista di utenti in CouchDB (utilizzando libreria Python CouchDB & quadro Flask) che hanno un nome utente (che è il _id) ed e-mail. Voglio usare l'elenco di indirizzi email in una casella di selezione in un modello Jinja2.
Il mio primo problema è come accedere gli indirizzi email. Se faccio:
for user in db:
doc = db[user]
emails = doc['email']
print options
I ottenere:
email@domain.com
otheremail@otherdomain.com
yetanotheremail@yetanotherdomain.com
Così posso ottenere la mia lista dei messaggi di posta elettronica. Ma dove la mia inesperienza brutale sta rivelando è che io non so come poi li usa per. La lista esiste solo nel ciclo for. Come faccio a restituire quella lista come una lista utile di variabili? E come faccio poi fare quella lista compaiono nel mio modello Jinja2 in un menu a discesa l'opzione. Credo che ho bisogno di una funzione, ma io sono un programmatore verde.
Sarebbe così apprezzare aiuto.
Soluzione
Supponendo di avere un modello come:
class User(Document):
email = TextField()
È possibile utilizzare il metodo load
statico della classe utente
users = [User.load(db, uid) for uid in db]
Ora si può fare questo:
for user in users:
print user.id, user.email
Ma lo si usa nel pallone così, a suo avviso è possibile inviare questo elenco di utenti al tuo modello utilizzando qualcosa di simile:
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)
Ora nel modello users.html
Jinja2 il seguente output volontà una casella di riepilogo a discesa di ciascun utente e-mail
<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 del basso livello di codifica 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 mi è familiare con la boccetta. Inoltre, io ovviamente non includono una piena applicazione della boccetta / CouchDB qui, quindi i bit di codice sono mancanti.
Altri suggerimenti
Si passa i parametri per un modello di Jinja come d
dizionario quando si chiama la funzione template.renderfunction(d)
(per 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 gestirli comunque vuoi.
PS -. Sono sicuro che il codice potrebbe essere più elegante / più ottimizzato con una comprensione lista o qualsiasi altra cosa, ma ho pensato che avrei dovuto sottolineare la leggibilità di un cosiddetto programmatore "verde"
lista = [ x for x in db ] # watch out for big databases, you can run out of memory