Wie kehre ich eine Liste als eine Variable in Python und Verwendung in Jinja2?
Frage
Ich bin ein sehr junger Programmierer und ich versuche, etwas in Python zu tun, aber ich bin fest. Ich habe eine Liste von Benutzern in CouchDB (mit Python couchdb Bibliothek & Flask-Framework), die einen Benutzernamen haben (was die _id ist) und E-Mail. Ich mag die Liste der E-Mail-Adressen in einer Auswahlbox in einer jinja2 Vorlage verwenden.
Mein erstes Problem ist, wie die E-Mail-Adressen zuzugreifen. Wenn ich das tue:
for user in db:
doc = db[user]
emails = doc['email']
print options
ich:
email@domain.com
otheremail@otherdomain.com
yetanotheremail@yetanotherdomain.com
So kann ich meine Liste von E-Mail bekommen. Aber wo mein brutal Unerfahren zeigt nach oben ist, dass ich weiß nicht, wie dann, sie zu benutzen. Die Liste ist nur in der for-Schleife. Wie kehre ich diese Liste als eine verwendbare Liste von Variablen? Und wie kann ich dann diese Liste erscheint in meiner jinja2 Vorlage in einer Option Dropdown-Menü. Ich glaube, ich brauche eine Funktion, aber ich bin ein grüner Programmierer.
würde schätzen, so Hilfe.
Lösung
Unter der Annahme, haben Sie ein Modell wie zum Beispiel:
class User(Document):
email = TextField()
Sie können die statische Methode load
der Benutzerklasse
users = [User.load(db, uid) for uid in db]
Jetzt können Sie dies tun:
for user in users:
print user.id, user.email
Aber Sie verwenden es in der Flasche aus Ihrer Sicht so können Sie senden diese Liste der Benutzer der Vorlage so etwas wie dies mit:
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)
Jetzt im users.html
jinja2 Vorlage des folgenden ausgeben wird ein Dropdown-Listenfeld von jedem Benutzer E-Mail
<select>
{% for user in users %}
<option value="{{ user.id }}">{{ user.email }}</option>
{% endfor %}
</select>
Auch sind Sie mit der Kolben-CouchDB Erweiterung? Es könnte in abstrahieren einige der geringen couchdb hilfreich sein Codierung: http: //packages.python. org / Flask-CouchDB /
Disclaimer: Der obige Code wurde nicht getestet, sollte aber gut funktionieren. Ich weiß nicht viel über CouchDB, aber ich bin mit Flask. Auch ich habe offensichtlich keine vollständige Flask / CouchDB Anwendung ist hier, also Bit-Code fehlen.
Andere Tipps
Sie übergeben Parameter an eine jinja Vorlage als Wörterbuch d
, wenn Sie die template.renderfunction(d)
Funktion (zum Beispiel) nennen. So könnten Sie tun:
emails = []
for user in db:
doc = db[user]
emails.append(doc['email'])
some_jinja_template.render({'list_of_emails' : emails})
Dann in der Vorlage, könnten Sie so etwas wie tun:
<ul>
{% for address in list_of_emails %}
<li><a href="mailto:{{ address }}">Send email to {{ address }}</a></li>
{% endfor %}
</ul>
Um eine Liste von E-Mail zu machen, zum Beispiel, oder mit ihnen umgehen aber Sie mögen.
PS -. Ich bin sicher, könnte der Code elegantere / mehr mit einer Liste Verständnis optimierte oder was auch immer, aber ich dachte, ich Lesbarkeit für einen so genannten „grünen“ Programmierer betonen sollte
lista = [ x for x in db ] # watch out for big databases, you can run out of memory