2014-02-13 10 views
6

Wie kann ich 'pk' oder 'id' in get_context_data von CVB DetailView bekommen?Wie kann ich "pk" oder "id" in "get_context_data" von CVB bekommen?

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:

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

In Vorlage wie 'something.0.pk' –

+0

ich aufgrund CVB verwirrt tun bedeutet, dass Sie Class Based Views (CBV)? .. –

Antwort

14

Sie können es von self.kwargs['pk'] bekommen.

Ich bin mir nicht sicher, warum Sie wollen, da die Oberklasse bereits das Buch erhält, das diesem PK entspricht - das ist der Sinn einer Detailansicht.

+0

dann' kwargs [ 'pk'] ' –

+0

My queryset sieht anders aus (ist komplexer). Book.objects.filter (pk = pk) ist nur ein Beispiel. Vielen Dank. – user3284589

3

In get_context_data haben Sie bereits das Objekt in self.object (und Sie können self.object.pk tun). Hier ist, was in der Klassenhierarchie geschieht Upstream (Detailview erbt von 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) 

Lesen Django Quellcode zu verstehen Sachen unglaublich einfach ist.

Und übrigens, ich bin mir nicht sicher, dass Sie sich immer darauf verlassen können, dass Kwargs einen 'PK' Schlüssel hat.

2

Neben es von self.kwargs bekommen wie Daniel Roseman vorgeschlagen, können Sie self.get_object().pk, zum Beispiel, wenn Sie Ihre URL-Kennung von pk ändern, sagen wir, slug oder so etwas.

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 
Verwandte Themen