如何在CVB的`get_context_data`中获得'pk'或'id'?

时间:2014-02-13 15:39:36

标签: django django-class-based-views

如何从CVB DetailView中获取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:

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

7 个答案:

答案 0 :(得分:28)

您可以从self.kwargs['pk']获取。

我不确定你为什么要这么做,因为超类已经得到了对应于那个pk的Book - 这就是DetailView的全部要点。

答案 1 :(得分:6)

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

答案 2 :(得分: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'键的事实。

答案 3 :(得分:3)

除了像Daniel Roseman建议的那样从self.kwargs获取,您可以使用self.get_object().pk,例如,如果您将网址标识从pk更改为slug或者别的什么。

答案 4 :(得分:1)

你可以简单地在'get'方法中获取它,如下所示:

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

答案 5 :(得分:1)

self.kwargs['pk']在Django 2.2中不起作用

  

在DetailView中

     

self.object是此视图显示的对象。

     

因此,只需访问idpk即可访问对象self.object.idself.object.pk之类的字段

因此,Django 2.2中的答案可能类似于:

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

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

Django 2.2 Doc

答案 6 :(得分:0)

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

Filter 返回与查找参数 (pk) 匹配的查询集。由于 'pk' 是唯一的,它会返回与 get 相同的结果,但对于性能问题,理想情况下您希望使用 get 方法返回单个对象:

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