zwei identische views, nur eine liefert Ergebnisse

Django, Flask, Bottle, WSGI, CGI…
Antworten
nihilist
User
Beiträge: 28
Registriert: Dienstag 13. Februar 2007, 07:02

Hello again :)
Ich habe eine Django-App mit folgendem Inhalt

models.py

Code: Alles auswählen

class Dpkg(models.Model):
    hostname = models.CharField(max_length=20)
    status = models.CharField(max_length=2)
    name = models.CharField(max_length=50)
    version = models.CharField(max_length=50)
    description = models.TextField()
    def __unicode__(self):
         return self.hostname
urls.py

Code: Alles auswählen

    [...] 
    (r'^host/(?P<host>[a-zA-Z]+)$', 'packages.views.host'),
    (r'^package/(?P<package>[a-zA-Z0-9_.-]+)$', 'packages.views.package'),
[...]
views.py

Code: Alles auswählen

 def host(request, host):
     host_list = Dpkg.objects.filter(hostname=host)
     return render_to_response('host/detail.html', { 'host_list ' : host_list})
 
 def package(request, package):
     package_list = Dpkg.objects.filter(name=package).order_by('-version')
     return render_to_response('packages/detail.html', { 'package_list': package_list})
Rufe ich die URL
http://127.0.0.1:8000/package/xy
auf, wird die Seite mit Inhalt wiedergegeben.
Bei
http://127.0.0.1:8000/host/xy
funktioniert das nicht.

(der Paketname bzw. hostname existiert beidesmal in der DB)

Woran liegt das? Kann ausser der etwas anderen regexp in der urls.py keine Unterschied erkennen.(auch mit identischer regexp kein Erfolg)

Das template-file ist beidesmal identisch, (von s/host/package/g mal abgesehen)

Code: Alles auswählen

 {% for host in host_list %}
 <li>
          {{ host.hostname }} {{ host.version }} {{ host.name }}
 
 </li>
{% endfor %
Gibt es 'ne Möglichkeit eine "verbose" Ausgabe des ganzen zu bekommen?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Kannst du "funktioniert nicht" präzisieren...
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
nihilist
User
Beiträge: 28
Registriert: Dienstag 13. Februar 2007, 07:02

Naja, deswegen auch die Frage ob man die Ausgabe noch ausführlicher bekommen kann.

Im Moment kann ich nur sagen das bei dem ersten Beispiel, wenn ich die Seite aufrufe, zu dem in der url geschriebenen package die passenden Hostnamen und Versionen ausgegeben werden.

Bei dem zweiten Beispiel sollen dann alle packages die auf dem in der url angegeben host installiert sind ausgegeben werden. Die Seite bleibt leer, d.h. meine for-schleife im template liefert keine Ausgabe.
Also gehe ich davon aus das meine

Code: Alles auswählen

host_list
leer ist.


Wenn ich mir eine Liste erstelle und manell alle hostname ausgebe geht das, nur über die url und der übergabe mit

Code: Alles auswählen

 def host(request, host):
bleibt "host_list" leer

Hoffe ich konnte das jetzt etwas besser erklären :)
BlackJack

@nihilist: Statt nur davon auszugehen könntest Du es ja mal nachprüfen und ein paar mehr Zwischenergebnisse mit in das Template einfliessen lassen.
nihilist
User
Beiträge: 28
Registriert: Dienstag 13. Februar 2007, 07:02

Danke für deine Antwort, aber ich denke da brauche ich Hilfe, weiß nicht wie ich das anpacken soll.

Wie gesagt besteht das template nur aus der for-schleife.
Ich weiß nicht was du mit Zwischenergebnissen meinst bzw. was ich da sonst noch ausgeben soll ausser den schon darin enthaltenen.
BlackJack

@nihilist: Dann schreib etwas mehr in das Template hinein. Zum Beispiel irgend eine feste Ausgabe ins Template und über den View übergeben an das Template, an der man sehen kann, dass es sich auch tatsächlich um die aktuellen Dateien handelt, also Änderungen in Template und View auch tatsächlich ankommen. Dann die `repr()`-Darstellung von den Argumenten, die in die View-Funktion reingehen, um zu sehen ob die Eingabeargumente überhaupt richtig ankommen. Und wenn Du nur annimmst das `host_list` leer ist, dann lass Dir doch einfach auch davon mal die Länge ausgeben.
SpiritCrusher
User
Beiträge: 13
Registriert: Montag 11. Januar 2010, 13:59
Wohnort: Köln
Kontaktdaten:

Hast du mal mit nem print Statement geschaut, ob überhaupt was in dem Queryset drin ist, dass du da erzeugst? Wenn ich ne Django App debugge, dann print ich einfach alles was interessant ist. Das landet dann im output vom development server...
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

SpiritCrusher hat geschrieben:Hast du mal mit nem print Statement geschaut, ob überhaupt was in dem Queryset drin ist, dass du da erzeugst? Wenn ich ne Django App debugge, dann print ich einfach alles was interessant ist. Das landet dann im output vom development server...
Genau, einfach ein `print host_list` for dem return...
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
nihilist
User
Beiträge: 28
Registriert: Dienstag 13. Februar 2007, 07:02

Füge ich ein "print host_list" sowie ein count ein:

Code: Alles auswählen

def host(request, host):                              
     host_list = Dpkg.objects.filter(hostname=host)
     print host_list
     count = Dpkg.objects.filter(hostname=host).count()
     print count
     return render_to_response('host/detail.html', { 'host_list ' : host_list})
Und rufe die url http://127.0.0.1:8000/host/homer danach auf, wobei "homer" der hostname ist erhalte ich das:

Code: Alles auswählen

Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[<Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, <Dpkg: homer>, '...(remaining elements truncated)...']
533
im output des development servers.

D.h. meine Annahme dass das queryset leer ist war Quark :)


Edit:
Ich habe den Fehler gefunden:

In

Code: Alles auswählen

return render_to_response('host/detail.html', { 'host_list' : host_list})
war nach host_list ein leerzeichen mit drin.

Code: Alles auswählen

return render_to_response('host/detail.html', { 'host_list ' : host_list})

Klarer Fall von kleiner Ursache, großer Wirkung :oops:

Vielen Dank an eure Mithilfe, denke das Überprüfen des querysets mithilfe von print, count usw. wird mir noch bei den kommenden Problem(chen) helfen :)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

nihilist hat geschrieben: war nach host_list ein leerzeichen mit drin.

Code: Alles auswählen

return render_to_response('host/detail.html', { 'host_list ' : host_list})
Deshalb am besten das dict über die alternative Variante mit Keyword-Arguments erzeugen, dann passiert so etwas nicht:

Code: Alles auswählen

return render_to_response('host/detail.html', dict(host_list=host_list))
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Antworten