Liste an Cheetah übergeben ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Liste an Cheetah übergeben ?

Beitragvon debian75 » Dienstag 4. Dezember 2007, 00:23

moin

ich möchte eine liste an ein cheetah.tmpl übergeben. leider bekomme ich einen "IndexError: string index out of range" error. template.title geht, aber die liste nicht.


[code=]
li = []
li.append('1')
li.append('2')
etc...

template.title ="Hello World"
template.li = li
return str(template)
[/code]

[code=]
<table>
<tr>
<b>$title</b
<br>
#for $s in $li
<td><img src='$s[0]'></td>
<td valign='top'>$s[1]<br>
Broschiert<br>
Name: $s[2]<br>
Vorname: $s[3]<br>
</td>
#end for
</tr>
</table>
#end block main
[/code]
BlackJack

Beitragvon BlackJack » Dienstag 4. Dezember 2007, 08:31

Das hat nichts mit Listen oder Cheetah zu tun. Folgender halbwegs äquivalenter, reiner Python-Code hat genau das gleiche Problem:

Code: Alles auswählen

li = ['1', '2', '3']
for s in li:
    print s[0]
    print s[1]


Eine Zeichenkette der Länge 1 hat eben kein zweites Zeichen -> `IndexError`.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Liste an Cheetah übergeben ?

Beitragvon gerold » Dienstag 4. Dezember 2007, 08:33

debian75 hat geschrieben:[code=]li = []
li.append('1')
li.append('2')
template.li = li
return str(template)[/code]

Code: Alles auswählen

#for $s in $li
  <td><img src='$s[0]'></td>
  <td valign='top'>$s[1]<br>
#end for

Hallo debian75!

``#for $s in $li`` geht jeden Eintrag der Liste durch.

Deine Liste sieht so aus: ``['1', '2', '3']``

Ein Eintrag sieht dann so aus: ``'1'``

Du kannst zwar mit ``$s[0]`` das erste Zeichen dieses Listeneintrages heraus holen, aber ein ``$s[1]`` gibt den Fehler, da in diesem String kein zweites Zeichen drinnen ist.

Du müsstest deine Liste so befüllen:

Code: Alles auswählen

li = []
li.append(('http://hallo.xx/image1.jpg', 'Das ist ein Bild'))
li.append(('http://hallo.xx/image2.jpg', 'Das ist noch ein Bild'))

Diese Liste würde dann so aussehen:

Code: Alles auswählen

[
    ('http://hallo.xx/image1.jpg', 'Das ist ein Bild'),
    ('http://hallo.xx/image2.jpg', 'Das ist noch ein Bild'),
]

Dann kannst du auch mit ``$s[0]`` und ``$s[1]`` auf die beiden Einträge zugreifen.

mfg
Gerold
:-)
Zuletzt geändert von gerold am Dienstag 4. Dezember 2007, 10:34, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

Beitragvon debian75 » Dienstag 4. Dezember 2007, 10:27

hallo gerold,

das wunder mit etwas, weil wenn ich in der konsole print li[0] mache, dann printet er mir nicht nur einen buchstaben, sondern das ganze wort.

im prinzip will ich sowas wie nen array
[code=]
li = ['hallo', 'ich', 'bin', 'ein', 'array']

print li[0] ergibt --> hallo
print li[1] ergibt --> ich
[/code]

etc...

ich bin sicher mit deinem vorlschlag bekomm ich das irgendwie hin.
naja, mal rumspielen wenn ich heim komme.

thnx und gruss
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 4. Dezember 2007, 10:36

debian75 hat geschrieben:[code=]li = ['hallo', 'ich', 'bin', 'ein', 'array']

print li[0] ergibt --> hallo
print li[1] ergibt --> ich[/code]

Hallo debian75!

Aber du machst ja das hier:

Code: Alles auswählen

li = ['hallo', 'ich', 'bin', 'ein', 'array']

for s in li:
    print s[0] # ergibt: "h" und nicht "hallo"

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Beitragvon Jan-Peer » Dienstag 4. Dezember 2007, 12:22

Noch deutlicher: Du hast da ein Verständnisproblem bezüglich der for-Schleife:

for s in li heißt nichts anderes, als das er `s` bei jedem Durchlauf das nächste Element der Liste zuweist.

Was du zu konstruieren versucht hast (wie man es ja aus anderen Sprachen kennt) wäre ein Laufindex über der Länge der Liste, in Python folgendermaßen zu lösen:

Code: Alles auswählen

for i in range(len(li)):
    print li[i]
BlackJack

Beitragvon BlackJack » Dienstag 4. Dezember 2007, 12:32

Wobei man letzteres nicht machen sollte, da unnötig komplex.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder