Вопрос

Я хочу изменить результаты запроса 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 стоимость в каждом случае разная.

В первом примере items это объект запроса из Items.query.Это значение можно перебирать, поэтому цикл for работает.Но предметы нужно хранить где-то постоянно.В шаблоне запрос повторяется снова, и возвращаются новые экземпляры Items, которые не были изменены в представлении.

Во втором примере items является результатом paginate, список Items.Когда вы изменяете каждый элемент, он по-прежнему сохраняется в списке, и повторная итерация по нему в шаблоне приводит к получению тех же элементов.

Чтобы устранить ошибку из первого примера, вам необходимо сохранить ссылки на возвращаемые элементы.Самый простой способ сделать это — заставить запрос возвращать список: items = Items.query.all().

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top