2010-10-19 26 views
9

我是一个非常年轻的程序员,我试图在Python中做一些事情,但我被卡住了。我有一个Couchdb用户列表(使用python couchdb库& Flask框架)谁有一个用户名(这是_id)和电子邮件。我想在jinja2模板的选择框中使用电子邮件地址列表。如何返回一个列表作为Python中的变量并在Jinja2中使用?

我的第一个问题是如何访问电子邮件地址。如果我做的:

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

我得到:

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

所以我可以得到我的电子邮件列表。但是,如果我的残酷缺乏经验,我不知道如何使用它们。该列表仅存在于for循环中。如何将该列表作为可用的变量列表返回?然后,我如何让该列表出现在我的jinja2模板中的选项下拉列表中。我想我需要一个功能,但我是一个绿色的程序员。

会很感激的帮助。

回答

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) 

现在,在您users.html的Jinja2模板下面将输出每个用户的电子邮件

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

此外,您使用的砂箱的CouchDB扩展的下拉列表框?这可能有助于抽象出一些低级别的couchdb编码:http://packages.python.org/Flask-CouchDB/

声明:上面的代码没有经过测试,但应该可以正常工作。我对CouchDB了解不多,但我对Flask很熟悉。另外,我显然没有在这里包含完整的Flask/CouchDB应用程序,所以缺少一些代码。

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

-1:'list'是一个糟糕的变量名。最糟糕的选择之一。 – 2010-10-19 17:08:14

+0

@ S.Lott:的确,感谢-1。 – 2010-10-19 18:15:36

3

当您调用template.renderfunction(d)函数(例如)时,将参数作为字典d传递给jinja模板。因此,你可以这样做:

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

然后在模板中,你可以这样做:

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

为了使电子邮件的列表,例如,或处理它们,但是你会喜欢。

PS - 我敢肯定,代码可能是更优雅/多用列表理解或任何优化,但我想我应该强调可读性所谓的“绿色”的程序员。

相关问题