2010-10-19 12 views
9

Jestem bardzo młodym programistą i próbuję coś zrobić w Pythonie, ale utknąłem. Mam listę użytkowników w Couchdb (przy użyciu biblioteki python couchdb & Flask framework), którzy mają nazwę użytkownika (która jest _id) i e-mail. Chcę użyć listy adresów e-mail w polu wyboru w szablonie jinja2.Jak mogę zwrócić listę jako zmienną w Pythonie i użyć w wersji Jinja2?

Mój pierwszy problem polega na uzyskaniu dostępu do adresów e-mail. Jeśli mam zrobić:

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

uzyskać:

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

Więc mogę dostać listę e-maili. Ale tam, gdzie pojawia się mój brutalny brak doświadczenia, nie mam pojęcia, jak z nich korzystać. Lista istnieje tylko w pętli for. Jak mogę zwrócić tę listę jako użyteczną listę zmiennych? I w jaki sposób sprawić, aby ta lista pojawiła się w moim szablonie jinja2 na liście opcji. Chyba potrzebuję funkcji, ale jestem zielonym programistą.

Dziękuję za pomoc.

Odpowiedz

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) 

Teraz w szablonie jinja2 users.html następujące wyjście wola ListBox rozwijana e-mail każdego użytkownika

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

Również używasz rozszerzenia Kolba-couchdb? Pomocne może być wyodrębnienie niektórych kodowania couchdb niskiego poziomu: http://packages.python.org/Flask-CouchDB/

Uwaga: Powyższy kod nie był testowany, ale powinien działać poprawnie. Nie wiem zbyt wiele o CouchDB, ale znam Flask. Oczywiście oczywiście nie zawierałem pełnej aplikacji Flask/CouchDB, więc brakuje kawałków kodu.

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

-1: 'lista' jest okropną nazwą zmiennej. Jeden z najgorszych możliwych wyborów. –

+0

@ S.Lott: Rzeczywiście, dzięki za -1. –

3

Parametry można przekazać do szablonu jinja jako słownik d po wywołaniu funkcji template.renderfunction(d) (na przykład). W ten sposób, można zrobić:

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

Następnie w szablonie, można zrobić coś takiego:

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

Aby zrobić listę wiadomości e-mail, na przykład, albo obsługiwać je jednak chcesz.

PS - Jestem pewien, że kod mógłby być bardziej elegancki/bardziej zoptymalizowany ze zrozumieniem listy lub czymkolwiek, ale pomyślałem, że powinienem podkreślić czytelność dla tak zwanego "zielonego" programisty.