2016-09-23 7 views
1

Mit Klassen-basierten Ansichten in Django, habe ich ein Problem Filering in einem DetailView.Django - Filterung von get_context_data

Was ich möchte, ist eine Liste aller Filme in einem bestimmten Genre, zB: Movie.objects.all().filter(genre=genre_id).

class GenreView(generic.DetailView): 
    model = Genre 
    template_name = 'movies/genre.html' 
    context_object_name = 'this_genre' 
def get_context_data(self, **kwargs): 
    context = super(GenreView, self).get_context_data(**kwargs) 
    context.update({ 
     'all_movies': Movie.objects.all().filter(genre=pk), 
     'all_genres': Genre.objects.all() 
    }) 
    return context 

ich diesen Fehler:

Traceback (most recent call last): 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\handler 
s\base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\handler 
s\base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\views\generi 
c\base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\views\generi 
c\base.py", line 88, in dispatch 
    return handler(request, *args, **kwargs) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\views\generi 
c\detail.py", line 118, in get 
    context = self.get_context_data(object=self.object) 
    File "C:\Users\admin\trailers\movies\views.py", line 43, in get_context_data 
    'all_movies': Movie.objects.all().filter(genre=pk), 
NameError: name 'pk' is not defined 

Als ich versuchte, Movie.objects.all().filter(genre=pk) mit Movie.objects.all().filter(genre=kwargs['pk']) ersetzen Ich habe:

Traceback (most recent call last): 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\handler 
s\base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\core\handler 
s\base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\views\generi 
c\base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\views\generi 
c\base.py", line 88, in dispatch 
    return handler(request, *args, **kwargs) 
    File "C:\Program Files (x86)\Python35-32\lib\site-packages\django\views\generi 
c\detail.py", line 118, in get 
    context = self.get_context_data(object=self.object) 
    File "C:\Users\admin\trailers\movies\views.py", line 43, in get_context_data 
    'all_movies': Movie.objects.all().filter(genre=kwargs['pk']), 
KeyError: 'pk' 

Ich kann nicht scheinen, um herauszufinden, was falsch ist, jede mögliche Hilfe würde werde geschätzt!

+0

Könnten Sie bitte zeigen Sie mir Ihre URL für diese Klasse GenreView (generic.DetailView) anzeigen ?? – Rajesh

+0

url (r '^ genre/(? P [0-9] +)/$', ansichten.GenreView.as_view(), name = 'genre') – mari

Antwort

3

Der kwargs Parameter get_context_data bestanden nicht den Primärschlüsselwert des Objekts enthalten. Sie können es von self.kwargs obwohl erhalten:

Movie.objects.all().filter(genre=self.kwargs['pk']) 

Darüber hinaus werden Sie self.objectsehen (die die abgerufene die Genre Instanz) ist vorhanden und zugänglich, wenn Sie innerhalb get_context_data sind, so dass Sie verwenden können, dass, um Folgendes auch tun:

Movie.objects.all().filter(genre=self.object) 
+0

Beide funktionieren perfekt, obwohl ich 'Movie.objects bevorzuge. all(). filter (genre = selbst.objekt) 'danke! – mari

0
'all_movies': Movie.objects.all().filter(genre=pk) 

Sie haben buchstäblich nicht PK definiert. Sie müssen zuerst den pk der Variablen pk zuweisen.

Auch brauchen Sie nicht alle umfassen:

Movie.objects.filter(genre=pk)