12

私は非常に若いプログラマーで、Pythonで何かをしようとしていますが、行き詰まっています。ユーザー名(_id)と電子メールを持つCouchdb(python couchdbライブラリとFlaskフレームワークを使用)のユーザーのリストがあります。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関数を呼び出すときに、パラメーターを辞書としてjinjaテンプレートに渡します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-コードはリスト内包表記などでよりエレガント/最適化できると確信していますが、いわゆる「グリーン」プログラマーの可読性を強調する必要があると考えました。

于 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 に答える