Django maler og variable attributter

stemmer
32

Jeg bruker Google App Engine og Django maler.
Jeg har en tabell som jeg ønsker å vise objektene ser omtrent slik ut:

Object Result:
    Items = [item1,item2]
    Users = [{name='username',item1=3,item2=4},..]

Django malen er:

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

Django documention sier at når den ser en . variabler
Den prøver flere ting for å få data, hvorav den ene er ordbok oppslag som er akkurat hva jeg vil, men ser ikke ut til å skje ...

Publisert på 30/08/2008 klokken 13:20
kilden bruker
På andre språk...                            


6 svar

stemmer
32

Jeg fant en "bedre" / "bedre" løsning for å få variabler inne Det er ikke den hyggeligste måten, men det fungerer.

Du installerer et tilpasset filter i Django som får nøkkelen til din dict som parameter

For å gjøre det arbeidet i google app-engine du må legge til en fil til hovedkatalogen, ringte jeg min django_hack.py som inneholder dette lille stykke kode

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)

Nå som vi har denne filen, er alt vi trenger å gjøre er å fortelle app-motoren for å bruke det ... vi gjør det ved å legge til denne lille linjen til hovedfilen

webapp.template.register_template_library('django_hack')

og i malen visning legge denne malen i stedet for den vanlige kode

{{ user|hash:item }}

Og det skal fungere perfekt =)

Svarte 08/09/2008 kl. 19:01
kilden bruker

stemmer
9

Jeg antar at den delen ikke fungerer er {{ user.item }}.

Django vil være å prøve en ordbok oppslag, men ved anvendelse av strengen "item"og ikke verdien av den itemsløyfevariable. Django gjorde det samme når det løst {{ user.name }}til nameegenskap av userobjekt, snarere enn å lete etter en variabel kalt name.

Jeg tror du trenger å gjøre noe forbehandling av data etter din før du gjør det i malen.

Svarte 30/08/2008 kl. 14:16
kilden bruker

stemmer
8

Eller du kan bruke standard Django system som brukes til å løse attributter i tempaltes som dette:

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

Det bare virker

i malen:

{{ user|hash:item }}
Svarte 12/08/2010 kl. 09:36
kilden bruker

stemmer
3

@Dave Webb (jeg har ikke blitt vurdert høyt nok til å kommentere ennå)

Dot-oppslag kan oppsummeres slik: når malen systemet møter en prikk i et variabelnavn, den prøver følgende oppslag, i denne rekkefølgen:

* 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])

Systemet bruker den første oppslagstypen som fungerer. Det er kortslutning logikk.

Svarte 14/08/2009 kl. 15:45
kilden bruker

stemmer
2

Som en erstatning for k, v i user.items på Google programmotor ved hjelp av django templates hvor brukeren = { 'en': 1, 'b', 2, 'c', 3}

{% for pair in user.items %}
   {% for keyval in pair %} {{ keyval }}{% endfor %}<br>
{% endfor %}

en 1
b 2
c 3

pair = (nøkkel, verdi) for hver katalog element.

Svarte 27/06/2010 kl. 00:34
kilden bruker

stemmer
0

Burde ikke dette:

{{ user.item }}

være dette?

{{ item }}

er det ingen brukerobjekt i sammenheng innenfor den sløyfe ....?

Svarte 31/08/2008 kl. 22:29
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more