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'),
self.kwargs['pk']
から入手できます。
スーパークラスはすでにそのpkに対応するBookを取得しているので、なぜそうしたいのかわかりません。それがDetailViewの要点です。
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
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」キーがあるという事実を常に信頼できるかどうかはわかりません。
Daniel Rosemanが示唆したように、self.kwargs
から取得することに加えて、たとえば、URL識別子をpk
からslug
などに変更する場合、self.get_object().pk
を使用できます。
次のように、「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
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