Question

Je veux modifier les résultats à partir d'un flacon de sqlalchemy requête avant de l'envoyer à render_template().

Le point de vue des requêtes et modifie les articles:

items = Items.query

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

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

Lorsque le modèle sorties les éléments:

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

Cette erreur est indiqué dans le débogueur:

KeyError: 'date_modified'

Cependant, si je modifie la requête initiale pour obtenir une pagination de l'objet, l'erreur ne se pose pas et la date de modification s'affiche.

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)

Quelle est la différence entre le résultat de la Requête et de la Pagination résultat qui permet à cette dernière d'être manipulé en place, mais pas l'ancien?Comment puis-je modifier les résultats sans avoir à modifier la requête avec la pagination?

Était-ce utile?

La solution

Dans les deux exemples que vous passer items pour le modèle.Cependant, l' items la valeur est différente dans chaque cas.

Dans le premier exemple, items est l'objet de Requête de Items.query.Cette valeur peut être itéré, qui est pourquoi la boucle fonctionne.Mais les articles doivent être stocké dans un endroit permanent.Dans le modèle, la requête est itéré de nouveau, et de nouveaux Éléments instances sont retournées qui n'ont pas été modifiés dans la vue.

Dans le deuxième exemple, items est le résultat de paginate, une liste de Items.Lorsque vous modifiez chaque élément, il est toujours stocké dans la liste, et de parcourir à nouveau dans le modèle de résultats dans les mêmes éléments.

Pour résoudre l'erreur dans le premier exemple, vous avez besoin de stocker les références pour les articles retournés.La façon la plus simple de le faire est à la force, la requête retourne une liste: items = Items.query.all().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top