[1.5.x] Fixed #20659 -- Fixed PublisherDetail in CBV topic documentation.

Thanks to tudor.prodan, susan, and Tim Graham for the report and reviews.

Backport of 88de53d4a86548016f245a1413b856aa334bc737 from master.
This commit is contained in:
Baptiste Mispelon 2013-07-01 14:05:49 +02:00
parent 267aeabfc7
commit 0946aac61d

View File

@ -285,17 +285,18 @@ One way to do this is to combine :class:`ListView` with
for the paginated list of books can hang off the publisher found as the single for the paginated list of books can hang off the publisher found as the single
object. In order to do this, we need to have two different querysets: object. In order to do this, we need to have two different querysets:
**``Publisher`` queryset for use in ``get_object``** ``Book`` queryset for use by :class:`~django.views.generic.list.ListView`
We'll set the ``model`` attribute on the view and rely on the default Since we have access to the ``Publisher`` whose books we want to list, we
implementation of ``get_object()`` to fetch the correct ``Publisher`` simply override ``get_queryset()`` and use the ``Publisher``'s
object. :ref:`reverse foreign key manager<backwards-related-objects>`.
**``Book`` queryset for use by ``ListView``** ``Publisher`` queryset for use in :meth:`~django.views.generic.detail.SingleObjectMixin.get_object()`
The default implementation of ``get_queryset`` uses the ``model`` attribute We'll rely on the default implementation of ``get_object()`` to fetch the
to construct the queryset. This conflicts with our use of this attribute correct ``Publisher`` object.
for ``get_object`` so we'll override that method and have it return However, we need to explicitly pass a ``queryset`` argument because
the queryset of ``Book`` objects linked to the ``Publisher`` we're looking otherwise the default implementation of ``get_object()`` would call
at. ``get_queryset()`` which we have overridden to return ``Book`` objects
instead of ``Publisher`` ones.
.. note:: .. note::
@ -315,12 +316,11 @@ Now we can write a new ``PublisherDetail``::
from books.models import Publisher from books.models import Publisher
class PublisherDetail(SingleObjectMixin, ListView): class PublisherDetail(SingleObjectMixin, ListView):
model = Publisher # for SingleObjectMixin.get_object
paginate_by = 2 paginate_by = 2
template_name = "books/publisher_detail.html" template_name = "books/publisher_detail.html"
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object(queryset=Publisher.objects.all())
return super(PublisherDetail, self).get(request, *args, **kwargs) return super(PublisherDetail, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):