Как я могу вернуть список как переменную в Python и использовать в Jinja2?
Вопрос
Я очень молодой программист, и я пытаюсь что-то сделать в Python, но я застрял. У меня есть список пользователей в CouchDB (с помощью библиотеки Python CouchDB Framework & Flask), которые имеют имя пользователя (что является _ID) и электронной почтой. Я хочу использовать список адресов электронной почты в поле выбора в шаблоне Jinja2.
Моя первая проблема заключается в том, как получить доступ к адресам электронной почты. Если я сделаю:
for user in db:
doc = db[user]
emails = doc['email']
print options
Я получил:
email@domain.com
otheremail@otherdomain.com
yetanotheremail@yetanotherdomain.com
Так что я могу получить мой список электронных писем. Но где мой жестокий неопытность появляется, состоит в том, что я не знаю, как тогда их использовать. Список существует только в цикле для цикла. Как я могу вернуть этот список как единомышленников в виде использования переменных? И как я тогда сделаю этот список в моем шаблоне 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 здесь, поэтому биты кода отсутствуют.
Другие советы
Вы передаете параметры на шаблон 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