2014-02-13 45 views
6

如何從CVB DetailView中獲取get_context_data中的'pk'或'id'?如何從CVB中的'get_context_data`中獲得'pk'或'id'?

class MyDetail(DetailView): 
    model = Book 
    template_name = 'book.html' 

    def get_context_data(self, **kwargs): 
      context = super(MyDetail, self).get_context_data(**kwargs) 
      context['something'] = Book.objects.filter(pk=pk) 
      return context 

網址:

url(r'^book/(?P<pk>\d+)/$', MyDetail.as_view(), name='book'), 
+0

在模板中使用象'something.0.pk' –

+0

我糊塗由於CVB你是指基於類的視圖(CBV)?.. –

回答

14

您可以從self.kwargs['pk']得到它。

雖然我不確定你爲什麼要這樣做,因爲超類已經獲得了與該pk相對應的Book - 這就是DetailView的全部要點。

+0

然後'kwargs [ 'PK']' –

+0

我的查詢集看起來不一樣(更復雜)。 Book.objects.filter(pk = pk)就是例子。謝謝。 – user3284589

3

在get_context_data中,您已經擁有self.object中的對象(並且您可以執行self.object.pk)。下面是在類層次結構發生了上游(從的DetailView繼承BaseDetailView):

class BaseDetailView(SingleObjectMixin, View): 
""" 
A base view for displaying a single object 
""" 
def get(self, request, *args, **kwargs): 
    self.object = self.get_object() 
    context = self.get_context_data(object=self.object) 
    return self.render_to_response(context) 

閱讀Django的源代碼,瞭解的東西是非常容易的。並且順便說一句,我不確定你總是可以依靠kwargs有'pk'鍵的事實。

2

除了從self.kwargs丹尼爾·羅斯曼建議得到它,你可以,如果你改變從pk,比方說,slug什麼您的網址標識使用self.get_object().pk,例如。

3
class MyDetail(DetailView): 
    model = Book 
    template_name = 'book.html' 

    def get_context_data(self, **kwargs): 
      context = super(MyDetail, self).get_context_data(**kwargs) 
      context['something'] =Book.objects.filter(pk=self.kwargs.get('pk')) 
      return context 
相關問題