2016-09-23 54 views
1

在Django中使用基於類的視圖時,我在DetailView中存在一個問題文件。Django - 在get_context_data中進行過濾

我想得到的是一個特定類型的所有電影列表,即: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 

我得到這個錯誤:

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 

當我試圖用Movie.objects.all().filter(genre=kwargs['pk'])更換Movie.objects.all().filter(genre=pk)我:

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' 

我似乎無法弄清楚什麼是錯的,任何幫助將不勝感激!

+0

您能否告訴我您的此類GenreView(generic.DetailView)視圖的URL? – Rajesh

+0

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

回答

3

kwargs參數傳遞給get_context_data不包含對象的主鍵值。您可以從self.kwargs得到它,但:

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

而且,你會看到self.object(這是在Genre實例牽強)是存在且可訪問,當你在裏面get_context_data,這樣你就可以使用,爲了請執行以下操作:

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

儘管我更喜歡'Movie.objects, all()。filter(genre = self.object)'謝謝! – mari

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

你幾乎沒有定義pk。您需要首先將pk分配給pk變量。

你也並不需要包括所有:

Movie.objects.filter(genre=pk)