質問

Flask-Sqlalchemyクエリからの結果をrender_template()に送信する前に変更したいです。

ビューはアイテムを問い合わせて変更します:

items = Items.query

for i in items: 
    date = i.__dict__['date']
    i.__dict__['date_modified'] = date.replace('/', '-')

return render_template('index.html', items=items)
.

テンプレートが項目を出力するとき:

{% for i in items %}{{i.date_modified}}{% endfor %} 
.

このエラーはデバッガに表示されます。

KeyError: 'date_modified'
.

しかしながら、初期クエリを変更してページネーションオブジェクトを取得すると、エラーが発生せず、変更された日付が表示されます。

items = Items.query
items = items.paginate(page_num, items_per_page, True).items 

for i in items: 
    date = i.__dict__['date']
    i.__dict__['date_modified'] = date.replace('/', '-')

return render_template('index.html', items=items)
.

後者が前者の位置に操作されることを可能にするクエリ結果とページ挿入結果の違いは何ですか?Paginateを使用してクエリを変更せずに結果を変更する方法は?

役に立ちましたか?

解決

両方の例では、itemsをテンプレートに渡します。ただし、items値はそれぞれの場合では異なります。

最初の例では、itemsItems.queryのクエリオブジェクトです。この値を繰り返しすることができます。そのため、For Loopが機能する理由です。しかし、アイテムはどこかに恒久的な場所に保存する必要があります。テンプレートでは、クエリは再度繰り返され、新しいアイテムインスタンスが戻され、ビューで変更されていません。

2番目の例では、itemspaginateの結果、Itemsのリストです。各項目を変更すると、まだリストに格納され、テンプレートの中で再び繰り返すことができます。

最初の例からエラーを解決するには、返される項目に参照を保存する必要があります。これを行う最も簡単な方法は、クエリにリストを返すように強制することです:items = Items.query.all()

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top