Как я могу вернуть список как переменную в Python и использовать в Jinja2?

StackOverflow https://stackoverflow.com/questions/3970420

  •  09-10-2019
  •  | 
  •  

Вопрос

Я очень молодой программист, и я пытаюсь что-то сделать в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top