From a014ee02888d2fcea6880bef51f143632a60aab3 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee 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()