Frage

Ich möchte die Ergebnisse einer flask-sqlalchemy-Abfrage ändern, bevor ich sie an sende render_template().

Die Ansicht fragt die Elemente ab und ändert sie:

items = Items.query

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

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

Wenn die Vorlage die Elemente ausgibt:

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

Dieser Fehler wird im Debugger angezeigt:

KeyError: 'date_modified'

Wenn ich jedoch die ursprüngliche Abfrage ändere, um ein Paginierungsobjekt abzurufen, wird der Fehler nicht ausgelöst und das Änderungsdatum angezeigt.

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)

Was ist der Unterschied zwischen dem Abfrageergebnis und dem Paginierungsergebnis, der es ermöglicht, Letzteres direkt zu manipulieren, Ersteres jedoch nicht?Wie kann ich die Ergebnisse ändern, ohne die Abfrage mit Paginierung zu ändern?

War es hilfreich?

Lösung

In beiden Beispielen haben Sie bestanden items zur Vorlage.Allerdings ist die items Der Wert ist jeweils unterschiedlich.

Im ersten Beispiel items ist das Query-Objekt von Items.query.Über diesen Wert kann iteriert werden, weshalb die for-Schleife funktioniert.Die Gegenstände müssen jedoch an einem dauerhaften Ort aufbewahrt werden.In der Vorlage wird die Abfrage noch einmal wiederholt und es werden neue Items-Instanzen zurückgegeben, die in der Ansicht nicht geändert wurden.

Im zweiten Beispiel items ist das Ergebnis von paginate, eine Liste von Items.Wenn Sie jedes Element ändern, wird es weiterhin in der Liste gespeichert und ein erneutes Durchlaufen in der Vorlage führt zu denselben Elementen.

Um den Fehler aus dem ersten Beispiel zu beheben, müssen Sie die Verweise auf die zurückgegebenen Artikel speichern.Der einfachste Weg, dies zu tun, besteht darin, die Abfrage zu zwingen, eine Liste zurückzugeben: items = Items.query.all().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top