web-dev-qa-db-fra.com

Comment puis-je obtenir «Pk» ou «ID» dans `get_context_data» de CVB?

Comment puis-je obtenir "pk" ou "id" dans get_context_data de CVB DétacherView?

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

Vous pouvez l'obtenir de self.kwargs['pk'].

Je ne sais pas pourquoi vous voulez, cependant, puisque la superclasse reçoit déjà le livre correspondant à cette PK - c'est tout le point d'une vue détaillée.

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

Dans get_context_data, vous avez déjà l'objet dans self.Object (et vous pouvez faire self.Object.pk). Voici ce qui se passe en amont dans la hiérarchie de la classe (DétacherView hérités de Ticsetailview):

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)

Lecture Django code source pour comprendre les choses est incroyablement facile.

Et au fait, je ne suis pas sûr que vous puissiez toujours compter sur le fait que Kwargs a une clé "PK".

3
waverider

En plus de l'obtenir de self.kwargs Comme Daniel Roseman suggérait, vous pouvez utiliser self.get_object().pk, par exemple si vous modifiez votre identifiant d'URL de pk à, dites, dites, slug ou quelque chose.

3
Berislav Lopac

vous pouvez simplement l'obtenir dans la méthode 'Obtenir', comme ceci:

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'] Cela ne fonctionne pas dans Django 2.2

en détailléview

self.Object est l'objet que cette vue affiche.

Donc, pour accéder aux champs de l'objet comme id ou pk juste self.object.id ou self.object.pk

Donc, la réponse in Django 2.2 peut être comme:

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

1
C.K.