Seite 1 von 1

zwei identische views, nur eine liefert Ergebnisse

Verfasst: Donnerstag 28. April 2011, 13:50
von nihilist
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?

Re: zwei identische views, nur eine liefert Ergebnisse

Verfasst: Donnerstag 28. April 2011, 19:21
von ms4py
Kannst du "funktioniert nicht" präzisieren...

Re: zwei identische views, nur eine liefert Ergebnisse

Verfasst: Donnerstag 28. April 2011, 19:38
von nihilist
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 :)

Re: zwei identische views, nur eine liefert Ergebnisse

Verfasst: Donnerstag 28. April 2011, 20:03
von 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.

Re: zwei identische views, nur eine liefert Ergebnisse

Verfasst: Donnerstag 28. April 2011, 20:18
von nihilist
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.

Re: zwei identische views, nur eine liefert Ergebnisse

Verfasst: Donnerstag 28. April 2011, 20:26
von 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.

Re: zwei identische views, nur eine liefert Ergebnisse

Verfasst: Donnerstag 28. April 2011, 20:55
von SpiritCrusher
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...

Re: zwei identische views, nur eine liefert Ergebnisse

Verfasst: Donnerstag 28. April 2011, 21:06
von ms4py
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...

Re: zwei identische views, nur eine liefert Ergebnisse

Verfasst: Freitag 29. April 2011, 07:27
von nihilist
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 :)

Re: zwei identische views, nur eine liefert Ergebnisse

Verfasst: Freitag 29. April 2011, 09:44
von ms4py
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))