Pythonの変数としてリストを返し、Jinja2で使用するにはどうすればよいですか?
質問
私は非常に若いプログラマーであり、Pythonで何かをしようとしていますが、私は立ち往生しています。ユーザー名(_ID)と電子メールを持っているCouchDB(Python CouchDB Library&Flask Frameworkを使用)のユーザーのリストがあります。 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>
また、Flask-CouchDB拡張機能を使用していますか?低レベルのCouchDBコーディングの一部を抽象化するのに役立つかもしれません: http://packages.python.org/flask-couchdb/
免責事項:上記のコードはテストされていませんが、正常に動作するはずです。 CouchDBについてはあまり知りませんが、Flaskに精通しています。また、私は明らかにここにフルススク/CouchDBアプリケーションを含めなかったので、コードのビットがありません。
他のヒント
辞書としてパラメーターをジンジャテンプレートに渡す 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