Django-templates und Variablen-Attribute
-
09-06-2019 - |
Frage
Ich verwende Google App Engine und Django-Vorlagen.
Ich habe eine Tabelle, die ich möchte, um die Objekte anzuzeigen, die folgendermaßen Aussehen:
Object Result:
Items = [item1,item2]
Users = [{name='username',item1=3,item2=4},..]
Die Django-Vorlage ist:
<table>
<tr align="center">
<th>user</th>
{% for item in result.items %}
<th>{{item}}</th>
{% endfor %}
</tr>
{% for user in result.users %}
<tr align="center">
<td>{{user.name}}</td>
{% for item in result.items %}
<td>{{ user.item }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
Nun den Django-Dokumentation besagt, dass, wenn es sieht . in Variablen
Es wird versucht, mehrere Dinge, um die Daten zu erhalten, von denen Wörterbuchs, das ist genau das, was ich will, aber scheint nicht zu passieren...
Lösung
Ich fand ein "schöner"/"bessere" Lösung für das Variablen innerhalb Ist es nicht der schönste Weg, aber es funktioniert.
Sie installieren einen benutzerdefinierten filter in django, die erhält die Schlüssel von Ihr dict als parameter
Zu machen es Arbeit, die in der google-app-engine, die Sie brauchen, um add a file to your main directory, Ich rief mir django_hack.py was enthält dieses kleine Stück code
from google.appengine.ext import webapp
register = webapp.template.create_template_register()
def hash(h,key):
if key in h:
return h[key]
else:
return None
register.filter(hash)
Nun, wir haben diese Datei, alles, was wir tun müssen ist, sagen die app-engine zu verwenden, es...wir tun, dass durch das hinzufügen dieser kleinen Zeile Ihrer Hauptdatei
webapp.template.register_template_library('django_hack')
und in der Vorlage anzeigen, hinzufügen dieser Vorlage anstelle der üblichen code
{{ user|hash:item }}
Und Ihre sollte perfekt funktionieren =)
Andere Tipps
Ich gehe davon aus, dass der Teil der nicht funktioniert, ist {{ user.item }}
.
Django versucht, mit Hilfe eines Wörterbuchs, aber mit dem string "item"
und nicht der Wert der item
loop variable.Django hat die gleiche Sache, wenn es gelöst {{ user.name }}
der name
Attribut des user
Objekt, sondern als die Suche nach einer variable genannt name
.
Ich denke, Sie müssen zu tun einige Vorverarbeitung der Daten in Ihrem Blick, bevor Sie machen es in Ihrer Vorlage.
Oder verwenden Sie die Standard-django-system, die ist verwendet zu beheben die Attribute in tempaltes wie diese :
from django.template import Variable, VariableDoesNotExist
@register.filter
def hash(object, attr):
pseudo_context = { 'object' : object }
try:
value = Variable('object.%s' % attr).resolve(pseudo_context)
except VariableDoesNotExist:
value = None
return value
, Das einfach nur funktioniert
in Ihrer Vorlage :
{{ user|hash:item }}
@Dave Webb (habe ich noch nicht bewertet, hoch genug, um Kommentar noch)
Die dot-lookups können wie folgt zusammenfassen:wenn das template-system auf einen Punkt im Namen einer Variablen, versucht es die folgenden lookups in dieser Reihenfolge:
* Dictionary lookup (e.e., foo["bar"])
* Attribute lookup (e.g., foo.bar)
* Method call (e.g., foo.bar())
* List-index lookup (e.g., foo[bar])
Das system verwendet die erste lookup-Typ, der funktioniert.Es ist Kurzschluss-Logik.
Als Ersatz für k,v in user.Artikel, die auf Google App Engine mithilfe von django-Vorlagen, in denen user = {'a':1, 'b', 2, 'c', 3}
{% for pair in user.items %}
{% for keyval in pair %} {{ keyval }}{% endfor %}<br>
{% endfor %}
1
b 2
c 3
pair = (Schlüssel, Wert) für jedes Wörterbuch item.
sollte dies nicht:
{{ user.item }}
dies sein?
{{ item }}
es ist keine Benutzer-Objekt im Kontext, innerhalb dieser Schleife....?