Domanda

Voglio modificare i risultati da una query flak-sqlalchemy prima di inviarli a render_template().

La view Query e modifica gli elementi:

items = Items.query

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

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

Quando il modello emette gli elementi:

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

Questo errore è mostrato nel debugger:

KeyError: 'date_modified'
.

Tuttavia, se modifico la query iniziale per ottenere un oggetto di paginazione, l'errore non viene sollevato e viene visualizzata la data modificata.

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)
.

Qual è la differenza tra il risultato della query e il risultato del sagrazione che consente a quest'ultimo di manipolare in posizione ma non il primo?Come posso modificare i risultati senza modificare la query con Paginat?

È stato utile?

Soluzione

In entrambi gli esempi si passano items al modello.Tuttavia, il valore items è diverso in ciascun caso.

Nel primo esempio, items è l'oggetto query da Items.query.Questo valore può essere sovrameso, motivo per cui il loop funziona.Ma gli articoli devono essere memorizzati da qualche parte permanenti.Nel modello, la query è intersetata di nuovo, e vengono restituite nuove istanze di elementi che non sono state modificate nella vista.

Nel secondo esempio, items è il risultato di paginate, un elenco di Items.Quando si modifica ogni elemento, è ancora memorizzato nell'elenco e Itering su di esso di nuovo nei risultati del modello negli stessi elementi.

Per risolvere l'errore dal primo esempio, è necessario memorizzare i riferimenti agli elementi restituiti.Il modo più semplice per farlo è forzare la query per restituire un elenco: items = Items.query.all().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top