Da das "Problem" noch Jahre später besteht und der Funktionsweise von Django-Vorlagen eigen ist, schreibe ich lieber eine neue Antwort mit den vollständigen Details, warum dieses Verhalten unverändert bleibt.
So beheben Sie den Fehler
Zunächst besteht die Lösung darin, das defaultdict
in a dict
umzuwandeln, bevor es an den Vorlagenkontext übergeben wird:
context = {
'data': dict(new_data)
}
Sie sollten nicht verwenden defaultdict
in Django Objekte im Vorlagenkontext verwenden.
Aber wieso?
Der Grund für diesen "Fehler" wird in der folgenden Django-Ausgabe Nr. 16335 beschrieben :
In der Tat läuft es darauf hinaus, dass die Vorlagensprache dieselbe Syntax für die Suche nach Wörterbüchern und Attributen verwendet.
... und aus den Dokumenten :
Wörterbuchsuche, Attributsuche und Listenindexsuche werden mit einer Punktnotation implementiert. [...] Wenn eine Variable in eine aufrufbare Variable aufgelöst wird, ruft das Vorlagensystem sie ohne Argumente auf und verwendet ihr Ergebnis anstelle der aufrufbaren.
Wenn Django Ihren Vorlagenausdruck auflöst , wird es zuerst versuchtdata['items']
. ABER dies ist ein gültiger Ausdruck, der automatisch einen neuen Eintrag items
in Ihrem Standarddikt erstellt data
, mit einer leeren Liste initialisiert (im Fall des ursprünglichen Autors) und die erstellte Liste zurückgibt (leer).
Die beabsichtigte Aktion wäre, die Methode items
ohne Argumente der Instanz aufzurufen data
(kurz :) data.items()
, aber da dies data['items']
ein gültiger Ausdruck war, stoppt Django dort und erhält die gerade erstellte leere Liste.
Wenn Sie den gleichen Code versuchen, aber mit data = defaultdict(int)
, erhalten Sie einen TypeError: 'int' object is not iterable
, da Django nicht in der Lage ist, über den Wert "0" zu iterieren, der durch die Erstellung des neuen Eintrags von zurückgegeben wird defaultdict
.