print andere Ausgabe als im Template

Django, Flask, Bottle, WSGI, CGI…
Antworten
django-yip
User
Beiträge: 31
Registriert: Montag 19. Januar 2015, 11:12

Hallo,

ich bin bisschen verwundert, dass "print" eine andere Ausgabe hat als im Template.

Beispiel:

Code: Alles auswählen

print(name)
Kommt als Ausgabe:
  • Test 1
    Test 2
    Test 3
Wenn ich jetzt mit:

Code: Alles auswählen

...
test = (name)
pla = {'test':test}
return render_to_response('export.html', pla)

Code: Alles auswählen

{{ test }}
Kommt nur:
  • Test 1
Jemand ne Idee, wieso das Template nur 1 Wert ausgibt und nicht wie bei print alle gewünschten?
Zuletzt geändert von django-yip am Donnerstag 5. Februar 2015, 15:49, insgesamt 1-mal geändert.
BlackJack

@django-yip: Also bei Python 2.x würde ich jetzt auf einen Unterschied zwischen `str()` (wird bei ``print`` verwendet) und `unicode()` (wird im Template verwendet) tippen. Ansonsten müsstest Du mal verraten was `name` ist. Und bist Du sicher das die ``print``-Ausgabe nur von einem Aufruf der Funktion stammt?

Edit: Wobei der Quelltext den Du zeigst nicht zusammenpasst: Du übergibst dem Template den Wert unter dem Namen 'test', im Template steht dann aber angeblich ``{{ name }}``. Was denn nun?
django-yip
User
Beiträge: 31
Registriert: Montag 19. Januar 2015, 11:12

@BlackJack:

Code: Alles auswählen

 for datetime in queryset:
         for name in datetime.artikel_set.values_list('name', flat=True): print(name)

Code: Alles auswählen

 for datetime in queryset:
         for name in datetime.artikel_set.values_list('name', flat=True):
          test = (name)
*** Edit:
Edit: Wobei der Quelltext den Du zeigst nicht zusammenpasst: Du übergibst dem Template den Wert unter dem Namen 'test', im Template steht dann aber angeblich ``{{ name }}``. Was denn nun?
Habs geändert. Passiert wenn man zuviel testet.
BlackJack

@django-yip: So ganz passt es immer noch nicht denn ich würde im Template 'Test 3' erwarten.

Du hast ganz grundlegend nicht verstanden wie Schleifen und der Programmablauf funktionieren. Im ersten Fall gehst Du in einer Schleife alle Elemente durch und gibst in der Schleife jedes Element aus. Im zweiten Fall gehst Du alle Elemente durch und bindest in der Schleife jedes mal das aktuelle Element an den Namen `test` und gibst den Wert dann am Ende an die Funktion zum rendern des Templates. Also *den* *einen* Wert aus dem *letzten* Schleifendurchlauf. Denn natürlich ist nach einem ``test = 42`` der Name Test an den einen Wert (42) gebunden, egal an was man den Namen im Programmverlauf vorher schon mal gebunden hat. Du wunderst Dich also das nach

Code: Alles auswählen

a = 23
a = 42
print(a)
nicht

Code: Alles auswählen

23
42
ausgegeben wird sondern ”nur” Wenn Du eine Sequenz von Werten im Template haben möchtest, dann muss im Template ein Schleifenkonstrukt stehen, oder vielleicht auch ein Filter der eine Sequenz aus Zeichenketten eine einzige zusammensetzt.
django-yip
User
Beiträge: 31
Registriert: Montag 19. Januar 2015, 11:12

BlackJack hat geschrieben: ausgegeben wird sondern ”nur”
Ja, hast recht. Hab mich da vertan.

Wenn ich

Code: Alles auswählen

 for datetime in queryset:
         test1 = datetime.artikel_set.values_list('name', flat=True)
mache, erhalte ich zwar alles aber leider nur ziemlich dämlich formatiert.
[u'TEST1', u'TEST2', u'TEST3']
django-yip
User
Beiträge: 31
Registriert: Montag 19. Januar 2015, 11:12

Ah habs jetzt :)

Code: Alles auswählen

{{ test1|unordered_list }}
So, hab ich es bisschen schicker :)
BlackJack

@django-yip: Wie es aussieht hast Du auch das gleiche Problem noch mal mit der noch vorhandenen Schleife, da ist am Ende `test1` an den Wert gebunden der im *letzten* Schleifendurchlauf ermittelt wird. Alles davor wird einfach verworfen.
django-yip
User
Beiträge: 31
Registriert: Montag 19. Januar 2015, 11:12

BlackJack hat geschrieben:@django-yip: Wie es aussieht hast Du auch das gleiche Problem noch mal mit der noch vorhandenen Schleife, da ist am Ende `test1` an den Wert gebunden der im *letzten* Schleifendurchlauf ermittelt wird. Alles davor wird einfach verworfen.
Versteh ich nicht?!

Ich bekomme jetzt alle Werte die ich wollte. Oder was meinst genau?
BlackJack

@django-yip: Ich weiss nicht was ich da noch zu sagen soll. Wenn Du verstanden hast wie Schleifen und Zuweisungen funktionieren sollte es sehr deutlich ersichtlich sein dass das verdammt falsch aussieht. Entweder es werden Ergebnisse verworfen oder die Schleife ist an der Stelle das falsche Sprachmittel. Oder man sollte dokumentieren das diese Schleife dazu da ist alle bis auf das letzte Element aus dem `queryset` zu verwerfen. Und vielleicht sollte man sich auch überlegen was passiert wenn das `queryset` leer ist.
Antworten