Как мне вернуть список как переменную в Python и использовать в Jinja2? - PullRequest
10 голосов
/ 19 октября 2010

Я очень молодой программист, и я пытаюсь что-то сделать на 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 ]

19 голосов
/ 19 октября 2010

Предполагая, что у вас есть модель, такая как:

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.Кроме того, я, очевидно, не включил здесь полное приложение Flask / CouchDB, поэтому биты кода отсутствуют.

3 голосов
/ 19 октября 2010

Вы передаете параметры в шаблон 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 - я уверен, что код мог бы быть более элегантным / более оптимизированным с пониманием списка или чем-то еще, но я решил, что должен подчеркнуть удобочитаемость для так называемого "зеленого" программиста.

1 голос
/ 19 октября 2010
lista = [ x for x in db ] # watch out for big databases, you can run out of memory
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...