如何在Python中返回列表作为变量并在Jinja2中使用?

12 投票
3 回答
33598 浏览
提问于 2025-04-16 05:45

我是一名非常年轻的程序员,正在尝试用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模板中显示为一个下拉选项?我想我需要一个函数,但我还是个新手程序员。

非常感谢任何帮助。

3 个回答

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

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。

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>

比如说,可以用来生成一个电子邮件列表,或者按照你想要的方式处理它们。

补充一下 - 我知道代码可以用列表推导式或者其他方法写得更优雅/更高效,但我觉得对于一个所谓的“菜鸟”程序员来说,强调可读性更重要。

23

假设你有一个这样的模型:

class User(Document):
    email = TextField()

你可以使用用户类的静态方法 load

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

现在你可以这样做:

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

但是你是在使用 Flask,所以在你的视图中,你可以用类似这样的方式把用户列表发送到你的模板:

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>

另外,你有没有在使用 Flask-CouchDB 扩展?它可能会帮助你简化一些底层的 CouchDB 编码工作:http://packages.python.org/Flask-CouchDB/

免责声明:上面的代码没有经过测试,但应该可以正常工作。我对 CouchDB 了解不多,但对 Flask 比较熟悉。此外,我显然没有在这里提供一个完整的 Flask/CouchDB 应用,所以有些代码是缺失的。

撰写回答