Flask-SQLAlchemy 쿼리 결과 수정
-
21-12-2019 - |
문제
플라스크-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)
쿼리 결과와 후자가 제자리에서 조작될 수 있지만 전자가 아닌 페이지 매김 결과의 차이점은 무엇입니까?페이지 매기기를 사용하여 쿼리를 수정하지 않고 결과를 수정하려면 어떻게 해야 합니까?
해결책
두 예 모두 통과합니다. items
템플릿에.그러나, 그 items
가치는 경우마다 다릅니다.
첫 번째 예에서는 items
의 쿼리 개체입니다. Items.query
.이 값은 반복될 수 있으므로 for 루프가 작동합니다.하지만 아이템은 영구적인 어딘가에 보관되어야 합니다.템플릿에서 쿼리가 다시 반복되고 보기에서 수정되지 않은 새 Items 인스턴스가 반환됩니다.
두 번째 예에서는 items
의 결과이다 paginate
, 목록 Items
.각 항목을 수정하면 목록에 계속 저장되며 템플릿에서 다시 반복하면 동일한 항목이 생성됩니다.
첫 번째 예의 오류를 해결하려면 반환되는 항목에 대한 참조를 저장해야 합니다.이를 수행하는 가장 쉬운 방법은 쿼리가 목록을 반환하도록 강제하는 것입니다. items = Items.query.all()
.
제휴하지 않습니다 StackOverflow