如何将列表作为python中的变量返回并在jinja2中使用?
题
我是一个非常年轻的程序员,我想在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