如何从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'),
答案 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是此视图显示的对象。
因此,只需访问
id
或pk
即可访问对象self.object.id
或self.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
答案 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