2016-03-18 5 views
1

Ich übergebe ein Diktat aus einer Flask-Ansicht an eine Jinja-Vorlage. Ich kann die Werte im dict rendern, aber wenn ich versuche, sie an url_for zu übergeben, bekomme ich UndefinedError: 'dict object' has no attribute 'eId'. Warum ist der zweite Zugriff fehlgeschlagen, als der erste erfolgreich war?Zugriff auf Werte aus einem Dict in einer Funktion, die in einem Jinja-Ausdruck aufgerufen wird

@app.route('/') 
def show_entries(): 
    if session.get('logged_in'): 
     cur = g.db.execute('select title, text, id from entries1 WHERE userid = ? OR public = 1 order by id desc', [userInfo['userid']]) 
    else: 
     cur = g.db.execute('select title, text, id from entries1 WHERE public = 1 order by id desc') 
    entries = [dict(title=row[0], text=row[1], eId=row[2]) for row in cur.fetchall()] 
    return render_template('show_entries.html', entries=entries) 
{% for entry in entries %} 
    This works: {{ entry.eId }} 
    This errors: {{ url_for('delete_entry', btnId=entry.eId) }} 
{% endfor %} 
+0

Welcher Typ ist eId? Hast du es versucht {{url_for ('delete_entry', btnId = str (entry.eId))}} –

Antwort

1

Statt "{{ url_for('delete_entry', btnId= entry.eId) }}" sollten Sie "{{ url_for('delete_entry', btnId= entry['eId']) }}" haben, weil Elemente in einem Wörterbuch durch ihre get Methode zugegriffen werden soll. Der einzige Grund, dass {{ entry.title }} funktioniert, ist wegen Jinja2.

Essentiell {{ entry.title }} wird von Jinja bewertet, während "{{ url_for('delete_entry', btnId= entry.eId) }}" wird von Python ausgewertet und bricht.

0

Ihr entry ist ein Wörterbuch. Während die Ausdruckssyntax von Jinja die Verwendung der Attributsyntax (dict.attr) für Wörterbücher ermöglicht, müssen Sie, sobald Sie ein Argument an eine Funktion mit Python-Syntax übergeben, die normale Python-Wörterbuchzugriffssyntax dict['attr'] verwenden.

Verwandte Themen