Django templates en veranderlike eienskappe
-
09-06-2019 - |
Vra
Ek gebruik Google App Engine en Django templates.
Ek het 'n tafel wat ek wil hê dat die voorwerpe vertoon kyk iets soos:
Object Result:
Items = [item1,item2]
Users = [{name='username',item1=3,item2=4},..]
Die Django sjabloon is:
<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>
Nou die Django dokumentasie en bepaal dat wanneer dit sien 'n . in veranderlikes
Dit probeer 'n paar dinge om die data, waarvan een is woordeboek Soek dit is presies wat ek wil, maar lyk nie te gebeur nie kry ...
Oplossing
Ek het 'n "mooier" / "beter" oplossing vir die kry van veranderlikes binne Dit is nie die mooiste manier, maar dit werk.
Jy installeer 'n persoonlike filter in Django wat die sleutel van jou dict kry as 'n parameter
Om dit te laat werk in Google app-enjin wat jy nodig het om 'n lêer te voeg tot jou hoof directory, Ek het myne django_hack.py wat hierdie stukkie kode bevat
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)
Noudat ons hierdie lêer, al wat ons hoef te doen, is vertel die jeug-enjin om dit te gebruik ... ons dit doen deur die byvoeging van hierdie klein lyn om jou hoof lêer
webapp.template.register_template_library('django_hack')
en in jou sjabloon oog voeg hierdie sjabloon in plaas van die gewone kode
{{ user|hash:item }}
En sy moet perfek werk =)
Ander wenke
Ek neem aan dat die deel van die werk nie is {{ user.item }}
.
Django sal probeer om 'n woordeboek Soek, maar met behulp van die string "item"
en nie die waarde van die item
lus veranderlike. Django het dieselfde ding wanneer dit opgelos {{ user.name }}
om die name
kenmerk van die user
voorwerp, eerder as op soek na 'n veranderlike genoem name
.
Ek dink jy sal nodig hê om 'n paar preprocessing van die data in jou oog voor jy dit maak in jou sjabloon.
Of jy kan die standaard Django stelsel wat gebruik word om eienskappe in tempaltes soos hierdie op te los gebruik:
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
Dit net werk
in jou sjabloon:
{{ user|hash:item }}
@Dave Webb (i het nie gegradeer hoog genoeg nog nie kommentaar lewer)
Die dot soektogte kan opgesom word soos volg: wanneer die sjabloon stelsel ontmoetings 'n dot in 'n veranderlike naam, dit probeer die volgende soektogte, in hierdie volgorde:
* 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])
Die stelsel maak gebruik van die eerste lookup tipe wat werk. Dit is 'n kortsluiting logika.
As 'n plaasvervanger vir k, v in user.items op Google App Engine behulp van Django templates waar gebruikers = { 'n ': 1,' b ', 2,' c ', 3}
{% for pair in user.items %}
{% for keyval in pair %} {{ keyval }}{% endfor %}<br>
{% endfor %}
'n 1
b 2
c 3
pair = (sleutel, waarde) vir elke woordeboek item.
moet nie hierdie:
{{ user.item }}
wees nie?
{{ item }}
Daar is geen gebruiker voorwerp in die konteks dat lus ....?