Comment puis-je retourner une liste comme une variable en Python et l'utilisation dans Jinja2?

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

  •  09-10-2019
  •  | 
  •  

Question

Je suis un très jeune programmeur et je suis en train de faire quelque chose en Python, mais je suis coincé. J'ai une liste d'utilisateurs à l'aide de CouchDB (bibliothèque CouchDB python et cadre Flask) qui ont un nom d'utilisateur (qui est le _id) et le courrier électronique. Je veux utiliser la liste des adresses e-mail dans une boîte de sélection dans un modèle de jinja2.

Mon premier problème est de savoir comment accéder aux adresses e-mail. Si je fais:

for user in db:
    doc = db[user]
    emails = doc['email']
    print options

J'obtenir:

email@domain.com
otheremail@otherdomain.com
yetanotheremail@yetanotherdomain.com

Alors je peux obtenir ma liste d'e-mails. Mais où mon manque d'expérience brutale montre jusqu'à est que je ne sais pas comment les utiliser ensuite. La liste n'existe que dans la boucle. Comment puis-je retourner cette liste comme une liste de variables utilisable? Et comment puis-je faire alors cette liste apparaissent dans mon modèle de jinja2 dans un menu déroulant d'options. Je suppose que je besoin d'une fonction, mais je suis un programmeur vert.

TELLE apprécient l'aide.

Était-ce utile?

La solution

En supposant que vous avez un modèle tel que:

class User(Document):
    email = TextField()

Vous pouvez utiliser la méthode load statique de la classe utilisateur

users = [User.load(db, uid) for uid in db]

Maintenant, vous pouvez faire ceci:

for user in users:
    print user.id, user.email  

Mais vous l'utilisez dans un flacon si, dans votre vue, vous pouvez envoyer cette liste d'utilisateurs à votre modèle en utilisant quelque chose comme ceci:

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)

dans le modèle de jinja2 de users.html la sortie suite à une volonté listbox menu déroulant du courrier électronique de chaque utilisateur

<select>
{% for user in users %}
    <option value="{{ user.id }}">{{ user.email }}</option>
{% endfor %}
</select>

En outre, vous utilisez l'extension Flask-CouchDB? Il pourrait être utile à abstraire quelques-unes des CouchDB à faible niveau de codage: http: //packages.python. org / Flask-CouchDB /

Disclaimer: Le code ci-dessus n'a pas été testé, mais devrait fonctionner correctement. Je ne sais pas beaucoup sur CouchDB, mais je suis familier avec Flask. En outre, je suis évidemment prévoiraient pas une application complète Flask / CouchDB ici, donc des morceaux de code sont manquants.

Autres conseils

Vous passez des paramètres à un modèle de Jinja comme d dictionnaire lorsque vous appelez la fonction template.renderfunction(d) (par exemple). Ainsi, vous pouvez faire:

emails = []
for user in db:
    doc = db[user]
    emails.append(doc['email'])
some_jinja_template.render({'list_of_emails' : emails})

Ensuite, dans le modèle, vous pouvez faire quelque chose comme:

<ul>
{% for address in list_of_emails %}
    <li><a href="mailto:{{ address }}">Send email to {{ address }}</a></li>
{% endfor %}
</ul>

Pour faire une liste des e-mails, par exemple, ou de les manipuler comme vous le souhaitez.

PS -. Je suis sûr que le code pourrait être plus élégant / plus optimisé avec une compréhension de liste ou autre chose, mais je me suis dit que je devrais mettre l'accent sur la lisibilité pour un soi-disant programmeur « vert »

lista = [ x for x in db ] # watch out for big databases, you can run out of memory
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top