Jak mohu vrátit seznam jako proměnné v Pythonu a použití v Jinja2?

hlasů
9

Jsem velmi mladý programátor a já se snažím dělat něco v Pythonu, ale já jsem uvízl. Mám seznam uživatelů v CouchDB (pomocí python CouchDB knihovna & rámec Flask), kteří mají uživatelské jméno (což je _id) a e-maily. Chci použít seznam e-mailových adres ve vybrané pole v šabloně jinja2.

Můj první problém je, jak získat přístup k e-mailové adresy. Pokud se mi:

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

Dostanu:

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

Tak jsem se může dostat svůj seznam e-mailů. Ale kde je moje brutální nezkušenost se ukazuje, je, že nevím, jak pak je používat. Tento seznam existuje pouze v cyklu for. Jak mohu vrátit tento seznam jako využitelnou seznam proměnných? A jak mám potom dělat, že seznam se objeví v mém jinja2 šablony v opční rozbalené. Myslím, že potřebuji funkci, ale já jsem zelený programátor.

By tak ocenit pomoc.

Položena 19/10/2010 v 17:19
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1
lista = [ x for x in db ] # watch out for big databases, you can run out of memory
Odpovězeno 19/10/2010 v 17:22
zdroj uživatelem

hlasů
16

Za předpokladu, že máte model jako například:

class User(Document):
    email = TextField()

Můžete použít statické metody loadtřídy User

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

Nyní si můžete udělat toto:

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

Ale vy jej používáte v nádobě tak, podle vašeho názoru, můžete odeslat seznam uživatelů do šablony pomocí něco takového:

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)

Nyní v users.htmljinja2 šablony následující vypíše rozbalovací listbox e-mailů každého uživatele

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

Také jste pomocí rozšíření Baňka-CouchDB? To by mohlo být užitečné oddělit některé z kódování CouchDB nízkou úroveň: http://packages.python.org/Flask-CouchDB/

Prohlášení: Výše ​​uvedený kód nebyl testován, ale měly by fungovat v pořádku. Nevím nic o CouchDB, ale jsem obeznámen s baňky. Také jsem samozřejmě neměla obsahovat plné uplatnění Baňka / CouchDB tady, takže chybí kousky kódu.

Odpovězeno 19/10/2010 v 18:40
zdroj uživatelem

hlasů
3

Předat parametry do džindža šablony jako slovníku dpři volání template.renderfunction(d)funkce (například). Tak jsi to mohl udělat:

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

Pak v šabloně, můžete udělat něco jako:

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

Chcete-li vytvořit seznam e-mailů, například, nebo s nimi manipulovat však budete chtít.

PS - jsem si jistý, že kód může být více elegantní / více optimalizován s porozuměním seznamu nebo cokoliv, ale já myslel bych měl zdůraznit, čitelnost na takzvané „zelené“ programátor.

Odpovězeno 19/10/2010 v 19:00
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more