2010-10-19 64 views
9

Tôi là một lập trình viên rất trẻ và tôi đang cố gắng làm điều gì đó bằng Python nhưng tôi bị kẹt. Tôi có một danh sách người dùng trong Couchdb (sử dụng thư viện python couchdb & khung công tác Flask) có tên người dùng (là _id) và email. Tôi muốn sử dụng danh sách địa chỉ email trong hộp chọn trong mẫu jinja2.Làm cách nào để trả về danh sách dưới dạng biến trong Python và sử dụng trong Jinja2?

Vấn đề đầu tiên của tôi là cách truy cập địa chỉ email. Nếu tôi làm:

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

tôi nhận được:

[email protected] 
[email protected] 
[email protected] 

Vì vậy, tôi có thể nhận được danh sách các email. Nhưng nơi sự thiếu kinh nghiệm tàn bạo của tôi xuất hiện là tôi không biết cách sử dụng chúng. Danh sách chỉ tồn tại trong vòng lặp for. Làm cách nào để tôi trả lại danh sách đó dưới dạng danh sách các biến có thể sử dụng? Và làm thế nào để tôi sau đó làm cho danh sách đó xuất hiện trong mẫu jinja2 của tôi trong một tùy chọn thả xuống. Tôi đoán tôi cần một chức năng nhưng tôi là một lập trình viên xanh.

Sẽ đánh giá cao sự trợ giúp.

Trả lời

15
# assuming you have something such as this: 
class User(Document): 
    email = TextField() 

# you can use the .load() method of the User class 
users = [User.load(db, uid) for uid in db] 

# now you can do this: 
for user in users: 
    print user.id, user.email 

# but you're using it in flask so, in your view you can send 
# this list of users to your template using something like this: 

from flask import render_template 
@app.route("/users") 
def show_users(): 
    return render_template('users.html', users=users) 

Bây giờ trong mẫu jinja2 users.html của bạn sẽ ra sau đây một ListBox thả xuống của e-mail của người dùng

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

Ngoài ra, bạn đang sử dụng phần mở rộng Flask-CouchDB? Có thể hữu ích khi trừu tượng hóa một số mã couchdb cấp thấp: http://packages.python.org/Flask-CouchDB/

Tuyên bố từ chối: Mã ở trên không được kiểm tra, nhưng sẽ hoạt động tốt. Tôi không biết nhiều về CouchDB, nhưng tôi quen với Flask. Ngoài ra, tôi rõ ràng không bao gồm một ứng dụng Flask/CouchDB đầy đủ ở đây, do đó, các bit mã bị thiếu.

1
lista = [ x for x in db ] # watch out for big databases, you can run out of memory 
+6

-1: 'danh sách' là một tên biến khủng khiếp. Một trong những lựa chọn tồi tệ nhất có thể. –

+0

@ S.Lott: thực sự, cảm ơn cho -1. –

3

Bạn chuyển các tham số vào mẫu jinja làm từ điển d khi bạn gọi hàm template.renderfunction(d) (ví dụ). Vì vậy, bạn có thể làm:

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

Sau đó, trong mẫu, bạn có thể làm một cái gì đó như:

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

Để thực hiện một danh sách các email, ví dụ, hoặc xử lý tuy nhiên bạn muốn.

PS - Tôi chắc chắn mã có thể thanh lịch hơn/được tối ưu hóa hơn với tính năng hiểu danh sách hoặc bất kỳ điều gì, nhưng tôi nghĩ tôi nên nhấn mạnh khả năng đọc cho một lập trình viên "xanh".

Các vấn đề liên quan