2010-10-19 8 views
9

Je suis un très jeune programmeur et j'essaye de faire quelque chose en Python mais je suis coincé. J'ai une liste d'utilisateurs dans Couchdb (en utilisant python couchdb library & Flask framework) qui ont un nom d'utilisateur (qui est le _id) et email. Je souhaite utiliser la liste des adresses e-mail dans une zone de sélection dans un modèle jinja2.Comment retourner une liste en tant que variable en Python et l'utiliser dans Jinja2?

Mon premier problème est de savoir comment accéder aux adresses e-mail. Si je fais:

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

Je reçois:

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

donc je peux obtenir ma liste d'e-mails. Mais là où mon inexpérience brutale se manifeste, c'est que je ne sais pas comment les utiliser. La liste n'existe que dans la boucle for. Comment renvoyer cette liste sous la forme d'une liste de variables utilisables? Et comment puis-je faire apparaître cette liste dans mon template jinja2 dans une liste déroulante d'options. Je suppose que j'ai besoin d'une fonction mais je suis un programmeur vert.

J'apprécierais de vous aider.

Répondre

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) 

maintenant dans votre users.html modèle jinja2 la sortie de volonté suite à une liste déroulante de courrier électronique de chaque utilisateur

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

En outre, vous utilisez l'extension Flask-CouchDB? Il pourrait être utile d'extraire une partie du codage couchdb de bas niveau: http://packages.python.org/Flask-CouchDB/

Avertissement: Le code ci-dessus n'a pas été testé, mais devrait fonctionner correctement. Je ne connais pas grand-chose à CouchDB, mais je connais Flask. De plus, je n'ai évidemment pas inclus une application Flask/CouchDB complète, donc des morceaux de code manquent.

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

-1: 'list' est un nom de variable horrible. L'un des pires choix possibles. –

+0

@ S.Lott: en effet, merci pour le -1. –

3

Vous transmettez des paramètres à un modèle jinja en tant que dictionnaire d lorsque vous appelez la fonction template.renderfunction(d) (par exemple). Ainsi, vous pouvez faire:

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

Ensuite, dans le modèle, vous pouvez faire quelque chose comme:

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

Pour faire une liste des e-mails, par exemple, ou de les manipuler comme vous le souhaitez. PS - Je suis sûr que le code pourrait être plus élégant/plus optimisé avec une compréhension de liste ou autre, mais j'ai pensé que je devrais mettre l'accent sur la lisibilité pour un programmeur dit "vert".

Questions connexes