2

私はsqlite dbを照会するフラスコアプリを持っています:

@app.route('/<subject_id>')
def subject_id_lookup(subject_id):
    entries = query_db('select visitdt, cvnotes from exam where id = ?',
                        [subject_id], one=True)
    return render_template('show_results.html', entries = entries)

ドキュメントからほとんど変更されていないフラスコ関数を使用していますquery_db()

def query_db(query, args=(), one = False):
    """Queries the database and returns a list of dictionaries"""
    cur = g.db.execute(query, args)
    rv = [dict((cur.description[idx][0], value)
        for idx, value in enumerate(row)) for row in cur.fetchall()]
    return (rv[0] if rv else None) if one else rv

最後に、私の show_results.html ファイルは次のとおりです。

{% extends "layout.html" %}
{% block body %}
    <ul class=entries>
        {% for entry in entries %}
        <li><h2>{{ entry }}</h2>
        <br>
        {% else %}
        <li><em>No entry here</em>
        {% endfor %}
    </ul>
    {% endblock %}

クエリは正常に実行されますが、変数名visitdt& 以外は何も返されませんcvnotes。上記の行を に変更すると<li><h2>{{ entry.cvnotes }}</h2>、何も返されません。subject_id_lookup()関数の結果を表示するようにクエリを変更するにはどうすればよいですか?

4

1 に答える 1

3

問題は、またはquery_dbを指定するかどうかによって異なるものを返すことです。one=Trueone=False

>>> query_db(your_query, [some_id], one=True)
{visittd: "a value", cvnotes: "some notes"}

>>> query_db(your_query, [some_id], one=False)
[{visittd: "a value", cvnotes: "some notes"}] # Note the wrapping list

辞書を列挙すると、結果は辞書のキーになります。リストを列挙すると、結果はリストのエントリになります。

>>> for thing in query_db(your_query, [some_id], one=True):
...    print thing
visitdt
cvnotes

>>> for thing in query_db(your_query, [some_id], one=False):
...    print thing
{visittd: "a value", cvnotes: "some notes"}

同じテンプレートを使用したいが、1 つの値に対して 1 つの値しか返されないことがわかっている場合 (または複数の値を処理しても問題ない場合) は、 のキーワード引数をid削除するだけです。 次に、キーを含む 1 つの辞書のリストになります。テンプレートで反復処理すると、各エントリは (単一の結果辞書のキーではなく) 結果辞書になり、機能します。one=Truesubject_id_lookupentriesvisitdtcvnotes{{ entry.cvnotes }}

于 2012-04-04T03:50:09.140 に答える