我是一个非常年轻的程序员,我想在python做某事,但我被卡住了。我有一个具有用户名(即_id)和电子邮件的CouchDB(使用Python Couchdb库和烧瓶框架)的用户列表。我想在jinja2模板中的选择框中使用电子邮件地址列表。

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

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

我得到:

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

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

非常感谢您的帮助。

有帮助吗?

解决方案

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

class User(Document):
    email = TextField()

您可以使用静态方法 load 用户类

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.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了解不多,但我对烧瓶很熟悉。另外,我显然在这里没有包含完整的烧瓶/couchdb应用程序,因此缺少一些代码。

其他提示

您将参数传递到Jinja模板作为字典 d 当您致电 template.renderfunction(d) 功能(例如)。因此,您可以做:

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-我敢肯定,通过列表理解或其他内容,代码可能更优雅/更优化,但我认为我应该强调所谓的“绿色”程序员的可读性。

lista = [ x for x in db ] # watch out for big databases, you can run out of memory
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top