From a014ee02888d2fcea6880bef51f143632a60aab3 Mon Sep 17 00:00:00 2001
From: Russell Keith-Magee <russell@keith-magee.com>
Date: Wed, 20 Oct 2010 00:21:47 +0000
Subject: [PATCH] Modified the implementation of get_object() to be consistent
 with the approach used elsewhere in the API. Also added documentation for
 get_object() which seems to have been accidentally omitted.

This is a BACKWARDS-INCOMPATIBLE CHANGE for anyone depending on the API for get_object() that was introduced (but not documented) in r14254.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14292 bcc190cf-cafb-0310-a4f2-bffc1f526a37
---
 django/views/generic/dates.py     |  4 ++--
 django/views/generic/detail.py    |  6 ++++--
 django/views/generic/edit.py      | 10 +++++-----
 docs/ref/class-based-views.txt    | 17 +++++++++++++++--
 docs/topics/class-based-views.txt |  4 ++--
 5 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/django/views/generic/dates.py b/django/views/generic/dates.py
index fe40b15580..74293f27a7 100644
--- a/django/views/generic/dates.py
+++ b/django/views/generic/dates.py
@@ -443,7 +443,7 @@ class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailV
     Detail view of a single object on a single date; this differs from the
     standard DetailView by accepting a year/month/day in the URL.
     """
-    def get_object(self, queryset=None, **kwargs):
+    def get_object(self, queryset=None):
         """
         Get the object this request displays.
         """
@@ -469,7 +469,7 @@ class BaseDateDetailView(YearMixin, MonthMixin, DayMixin, DateMixin, BaseDetailV
         lookup = _date_lookup_for_field(field, date)
         qs = qs.filter(**lookup)
 
-        return super(BaseDetailView, self).get_object(queryset=qs, **kwargs)
+        return super(BaseDetailView, self).get_object(queryset=qs)
 
 
 
diff --git a/django/views/generic/detail.py b/django/views/generic/detail.py
index 55b8e6055e..e75dd77409 100644
--- a/django/views/generic/detail.py
+++ b/django/views/generic/detail.py
@@ -14,7 +14,7 @@ class SingleObjectMixin(object):
     slug_field = 'slug'
     context_object_name = None
 
-    def get_object(self, pk=None, slug=None, queryset=None, **kwargs):
+    def get_object(self, queryset=None):
         """
         Returns the object the view is displaying.
 
@@ -27,6 +27,8 @@ class SingleObjectMixin(object):
             queryset = self.get_queryset()
 
         # Next, try looking up by primary key.
+        pk = self.kwargs.get('pk', None)
+        slug = self.kwargs.get('slug', None)
         if pk is not None:
             queryset = queryset.filter(pk=pk)
 
@@ -92,7 +94,7 @@ class SingleObjectMixin(object):
 
 class BaseDetailView(SingleObjectMixin, View):
     def get(self, request, **kwargs):
-        self.object = self.get_object(**kwargs)
+        self.object = self.get_object()
         context = self.get_context_data(object=self.object)
         return self.render_to_response(context)
 
diff --git a/django/views/generic/edit.py b/django/views/generic/edit.py
index f45a468ad6..1a361efd43 100644
--- a/django/views/generic/edit.py
+++ b/django/views/generic/edit.py
@@ -2,8 +2,8 @@ from django.forms import models as model_forms
 from django.core.exceptions import ImproperlyConfigured
 from django.http import HttpResponseRedirect
 from django.views.generic.base import TemplateResponseMixin, View
-from django.views.generic.detail import (SingleObjectMixin, 
-                        SingleObjectTemplateResponseMixin, BaseDetailView) 
+from django.views.generic.detail import (SingleObjectMixin,
+                        SingleObjectTemplateResponseMixin, BaseDetailView)
 
 
 class FormMixin(object):
@@ -191,11 +191,11 @@ class BaseUpdateView(ModelFormMixin, ProcessFormView):
     Using this base class requires subclassing to provide a response mixin.
     """
     def get(self, request, *args, **kwargs):
-        self.object = self.get_object(**kwargs)
+        self.object = self.get_object()
         return super(BaseUpdateView, self).get(request, *args, **kwargs)
 
     def post(self, request, *args, **kwargs):
-        self.object = self.get_object(**kwargs)
+        self.object = self.get_object()
         return super(BaseUpdateView, self).post(request, *args, **kwargs)
 
     # PUT is a valid HTTP verb for creating (with a known URL) or editing an
@@ -218,7 +218,7 @@ class DeletionMixin(object):
     success_url = None
 
     def delete(self, request, *args, **kwargs):
-        self.object = self.get_object(**kwargs)
+        self.object = self.get_object()
         self.object.delete()
         return HttpResponseRedirect(self.get_success_url())
 
diff --git a/docs/ref/class-based-views.txt b/docs/ref/class-based-views.txt
index ff0d49b013..0158bfec8b 100644
--- a/docs/ref/class-based-views.txt
+++ b/docs/ref/class-based-views.txt
@@ -158,6 +158,19 @@ SingleObjectMixin
 
         Designates the name of the variable to use in the context.
 
+    .. method:: get_object(queryset=None)
+
+        Returns the single object that this view will display. If
+        ``queryset`` is provided, that queryset will be used as the
+        source of objects; otherwise,
+        :meth:`~SingleObjectMixin.get_queryset` will be used.
+        :meth:`~SingleObjectMixin.get_object` looks for a ``pk``
+        argument in the arguments to the view; if ``pk`` is found,
+        this method performs a primary-key based lookup using that
+        value. If no ``pk`` argument is found, it looks for a ``slug``
+        argument, and performs a slug lookup using the
+        :attr:`SingleObjectMixin.slug_field`.
+
     .. method:: get_queryset()
 
         Returns the queryset that will be used to retrieve the object that
@@ -311,7 +324,7 @@ MultipleObjectMixin
         objects from that page.
 
     .. method:: get_paginate_by(queryset)
-    
+
         Returns the number of items to paginate by, or ``None`` for no
         pagination. By default this simply returns the value of
         :attr:`MultipleObjectMixin.paginate_by`.
@@ -506,7 +519,7 @@ ProcessFormView
     A mixin that provides basic HTTP GET and POST workflow.
 
     .. method:: get(request, *args, **kwargs)
-    
+
         Constructs a form, then renders a response using a context that
         contains that form.
 
diff --git a/docs/topics/class-based-views.txt b/docs/topics/class-based-views.txt
index f0c840f694..821ded63db 100644
--- a/docs/topics/class-based-views.txt
+++ b/docs/topics/class-based-views.txt
@@ -440,9 +440,9 @@ object, so we simply override it and wrap the call::
 
         queryset = Author.objects.all()
 
-        def get_object(self, **kwargs):
+        def get_object(self):
             # Call the superclass
-            object = super(AuthorDetailView, self).get_object(**kwargs)
+            object = super(AuthorDetailView, self).get_object()
             # Record the lass accessed date
             object.last_accessed = datetime.datetime.now()
             object.save()