문제

플라스크-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().

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top