Seite 1 von 1

Liste an Cheetah übergeben ?

Verfasst: Dienstag 4. Dezember 2007, 00:23
von debian75
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: Alles auswählen

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

template.title ="Hello World"
template.li = li
return str(template)

Code: Alles auswählen

<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

Verfasst: Dienstag 4. Dezember 2007, 08:31
von BlackJack
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`.

Re: Liste an Cheetah übergeben ?

Verfasst: Dienstag 4. Dezember 2007, 08:33
von gerold
debian75 hat geschrieben:

Code: Alles auswählen

li = []
li.append('1')
li.append('2')
template.li = li
return str(template)

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

Verfasst: Dienstag 4. Dezember 2007, 10:27
von debian75
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: Alles auswählen

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

print li[0] ergibt --> hallo
print li[1] ergibt --> ich
etc...

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

thnx und gruss

Verfasst: Dienstag 4. Dezember 2007, 10:36
von gerold
debian75 hat geschrieben:

Code: Alles auswählen

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

print li[0] ergibt --> hallo
print li[1] ergibt --> ich
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
:-)

Verfasst: Dienstag 4. Dezember 2007, 12:22
von Jan-Peer
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]

Verfasst: Dienstag 4. Dezember 2007, 12:32
von BlackJack
Wobei man letzteres nicht machen sollte, da unnötig komplex.