12

我是一个非常年轻的程序员,我正在尝试用 Python 做一些事情,但我被困住了。我在 Couchdb 中有一个用户列表(使用 python couchdb 库和 Flask 框架),他们有一个用户名(即 _id)和电子邮件。我想在 jinja2 模板的选择框中使用电子邮件地址列表。

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

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

我得到:

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

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

非常感谢帮助。

4

3 回答 3

23

假设您有一个模型,例如:

class User(Document):
    email = TextField()

您可以使用loadUser 类的静态方法

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

现在你可以这样做:

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

但是您在烧瓶中使用它,因此,在您看来,您可以使用以下内容将此用户列表发送到您的模板:

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)

现在在users.htmljinja2 模板中,下面将输出每个用户电子邮件的下拉列表框

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

另外,您使用的是 Flask-CouchDB 扩展吗?它可能有助于抽象出一些低级 couchdb 编码:http ://packages.python.org/Flask-CouchDB/

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

于 2010-10-19T17:40:36.133 回答
3

d当您调用template.renderfunction(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 - 我确信代码可以通过列表理解或其他方式更优雅/更优化,但我认为我应该强调所谓的“绿色”程序员的可读性。

于 2010-10-19T18:00:34.540 回答
1
lista = [ x for x in db ] # watch out for big databases, you can run out of memory
于 2010-10-19T16:22:07.480 回答