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'),
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.
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
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".
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.
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
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
oupk
justeself.object.id
ouself.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