web-dev-qa-db-ja.com

CVBから「get_context_data」の「pk」または「id」を取得するにはどうすればよいですか?

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'),
19
user3284589

self.kwargs['pk']から入手できます。

スーパークラスはすでにそのpkに対応するBookを取得しているので、なぜそうしたいのかわかりません。それがDetailViewの要点です。

39
Daniel Roseman
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
6
raghu

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
waverider

Daniel Rosemanが示唆したように、self.kwargsから取得することに加えて、たとえば、URL識別子をpkからslugなどに変更する場合、self.get_object().pkを使用できます。

3
Berislav Lopac

次のように、「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
2
Milad shiri

self.kwargs['pk'] Django 2.2では機能しません

detailView

self.objectは、このビューが表示しているオブジェクトです。

したがって、idpkのようなオブジェクトのフィールドにアクセスするには、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

Django 2.2ドキュメント

1
C.K.