2016-03-31 12 views
0

Ich hatte Schwierigkeiten, ListViews wie erwartet auf einem Blog-Projekt, an dem ich arbeite, zu rendern.Verwenden von get_queryset() -Methode in ListView, Django 1.9

Ich habe einen Tag-Modell, das Teil eines Post-Modell ist wie folgt (von meinem Beitrag Modell in models.py):

class Post(models.Model): 
    (...) 
     tags = models.ManyToManyField(Tag) 

TagListView in views.py sich wie folgt:

class TagListView(ListView): 
    def get_queryset(self): 
     slug = self.kwargs['slug'] 
     try: 
      tag = Tag.objects.get(slug=slug) 
      return tag.post_set.all() 
     except Tag.DoesNotExist: 
      return Post.objects.none() 
wie folgt

Das ist die uRL wie folgt (die im Projekt enthalten ist, wie wenn url(r'^blog/?', include('blog.urls')), ist:

url(r'^tag/(?P<slug>[a-zA-Z0-9-]+)?/?$', TagListView.as_view(
     paginate_by=5, 
     model=Tag, 
    )), 

Von dem, was ich verstehe, ruft der Zugriff auf eine URL, die in diesem Beispiel localhost:8000/blog/tag/<name-of-tag-here> sein sollte, TagListView in views.py auf, das dann die get_queryset()-Methode verwendet, um eine ListView von Posts mit einem Tag mit demselben Slug zu erstellen. die dann nach einer Vorlage sucht (um /blog/templates/blog), die in der Anleitung, die ich gerade betrachte, heißt tag_post_list.html, aber - die Dokumentation ist unklar, wie die ListView eine Vorlage zum Rendern findet und ich verfolge einfach ein veraltetes Tutorial .

Ich bin ein wenig verwirrt darüber, welche Variablen in die HTML-Vorlage übergeben werden und wie Sie darauf zugreifen. Aus den Ergebnissen geht hervor, dass get_queryset() nicht wirklich nur Beiträge mit der gleichen Tag-Liste zurückgibt. Furthermore, my css isn't rendering, either (which I've made a separate post for), obwohl es offensichtlich ist, dass andere Tags und Elemente aus meiner base.html Datei sind.

Die Vorlage beginnt {% extends 'base.html' %} (die sich in /blog/templates/ befindet) und greift auf Beiträge über {% for post in object_list %} zu. object_list enthält offensichtlich nicht, was ich denke, dass es sollte, was, soweit ich verstehe, wegen der Art und Weise sein sollte, die ich ListView get_queryset() Methode missbrauche.

Danke.

+0

Hier fehlt ein Debugging. Haben Sie sichergestellt, dass diese Sicht tatsächlich aufgerufen wird? Hast du sichergestellt, dass das Slug-Argument korrekt ist? Geht der Code in 'get_queryset'?Haben Sie untersucht, was von dieser Methode zurückgegeben wird? Sie können all dies mit dem Debugger machen oder einfach durch das Eingeben von Druckanweisungen sind die relevanten Punkte. –

+0

Abgesehen von allem anderen ist dies eine Liste von Posts, nicht von Tags, also sollte das Modell Post sein. Das würde jedoch nichts bewirken. –

+0

Was enthält 'object_list' eigentlich? Nichts? Etwas anderes? – YPCrumble

Antwort

2

Hier sind viele Fragen zu entpacken. Ein paar Antworten:

Ihre ListView hat ein template_name Attribut in dem Sie die Vorlage angeben können, verwenden, etwa so:

class TagListView(ListView): 

    template_name = "tag_post_list.html" 

    def get_queryset(self): 
     slug = self.kwargs['slug'] 
     try: 
      tag = Tag.objects.get(slug=slug) 
      return tag.post_set.all() 
     except Tag.DoesNotExist: 
      return Post.objects.none() 

this site Siehe für eine schnelle Liste der verfügbaren Attribute für die Klasse basierte Ansichten.

Zweite Antwort - Sie sagen, dass:

tag = Tag.objects.get(slug=slug) 
return tag.post_set.all() 

... Ihrer Ansicht nach ist eigentlich nicht die richtigen Post Objekte zurück. Aus dem Code geht nicht hervor, warum dies der Fall ist. Ihre Ansicht scheint korrekt zu sein, obwohl Daniel Roseman darauf hingewiesen hat, dass sie wahrscheinlich auf dem Modell Post basieren sollte, nicht Tag. Das Überschreiben der get_queryset-Methode zum Zurückgeben von Post-Objekten bedeutet jedoch, dass dies nicht das Problem ist. Es ist möglich, dass das Fixieren des ersten Problems den zweiten Fehler behebt, weil object_list nie aufgerufen wurde, weil das Template nicht aufgerufen wurde ...

+0

Danke. Der Link erklärt, was die Dokumentation fehlt. Es scheint, als ob das Hinzufügen von 'template_name =" tag_post_list.html "' die Ergebnisse hat, nach denen ich gesucht habe, was für mich jetzt keinen Sinn macht, wenn ich darüber nachdenke. Nun, um dieses Problem statischer Dateien zu lösen. –