Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #16101 -- Added parameters to SingleObjectMixin to override the…

… name of the URL keyword arguments used for pk and slug. Thanks, Andrew Ingram and Julien Phalip.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16569 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 2ccfb6d5c2ffb13ae3cb11a058ff574ab115518c 1 parent 5fffe57
@jezdez jezdez authored
View
6 django/views/generic/detail.py
@@ -13,6 +13,8 @@ class SingleObjectMixin(object):
queryset = None
slug_field = 'slug'
context_object_name = None
+ slug_url_kwarg = 'slug'
+ pk_url_kwarg = 'pk'
def get_object(self, queryset=None):
"""
@@ -27,8 +29,8 @@ def get_object(self, queryset=None):
queryset = self.get_queryset()
# Next, try looking up by primary key.
- pk = self.kwargs.get('pk', None)
- slug = self.kwargs.get('slug', None)
+ pk = self.kwargs.get(self.pk_url_kwarg, None)
+ slug = self.kwargs.get(self.slug_url_kwarg, None)
if pk is not None:
queryset = queryset.filter(pk=pk)
View
23 docs/ref/class-based-views.txt
@@ -136,6 +136,20 @@ SingleObjectMixin
The name of the field on the model that contains the slug. By default,
``slug_field`` is ``'slug'``.
+ .. attribute:: slug_url_kwarg
+
+ .. versionadded:: 1.4
+
+ The name of the URLConf keyword argument that contains the slug. By
+ default, ``slug_url_kwarg`` is ``'slug'``.
+
+ .. attribute:: pk_url_kwarg
+
+ .. versionadded:: 1.4
+
+ The name of the URLConf keyword argument that contains the primary key.
+ By default, ``pk_url_kwarg`` is ``'pk'``.
+
.. attribute:: context_object_name
Designates the name of the variable to use in the context.
@@ -146,10 +160,11 @@ SingleObjectMixin
``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``
+ ``get_object()`` looks for a
+ :attr:`SingleObjectMixin.pk_url_kwarg` argument in the arguments
+ to the view; if this argument is found, this method performs a
+ primary-key based lookup using that value. If this argument is not
+ found, it looks for a :attr:`SingleObjectMixin.slug_url_kwarg`
argument, and performs a slug lookup using the
:attr:`SingleObjectMixin.slug_field`.
View
10 docs/releases/1.4.txt
@@ -153,6 +153,16 @@ number of characters. Truncated strings end with a translatable ellipsis
sequence ("..."). See the :tfilter:`truncatechars docs <truncatechars>` for
more details.
+Customizable ``SingleObjectMixin`` URLConf kwargs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Two new attributes,
+:attr:`pk_url_kwarg<django.views.generic.detail.SingleObjectMixin.pk_url_kwarg>` and
+:attr:`slug_url_kwarg<django.views.generic.detail.SingleObjectMixin.slug_url_kwarg>`,
+have been added to :class:`django.views.generic.detail.SingleObjectMixin` to
+enable the customization of URLConf keyword arguments used for single
+object generic views.
+
CSRF improvements
~~~~~~~~~~~~~~~~~
View
14 tests/regressiontests/generic_views/detail.py
@@ -21,6 +21,13 @@ def test_detail_by_pk(self):
self.assertEqual(res.context['author'], Author.objects.get(pk=1))
self.assertTemplateUsed(res, 'generic_views/author_detail.html')
+ def test_detail_by_custom_pk(self):
+ res = self.client.get('/detail/author/bycustompk/1/')
+ self.assertEqual(res.status_code, 200)
+ self.assertEqual(res.context['object'], Author.objects.get(pk=1))
+ self.assertEqual(res.context['author'], Author.objects.get(pk=1))
+ self.assertTemplateUsed(res, 'generic_views/author_detail.html')
+
def test_detail_by_slug(self):
res = self.client.get('/detail/author/byslug/scott-rosenberg/')
self.assertEqual(res.status_code, 200)
@@ -28,6 +35,13 @@ def test_detail_by_slug(self):
self.assertEqual(res.context['author'], Author.objects.get(slug='scott-rosenberg'))
self.assertTemplateUsed(res, 'generic_views/author_detail.html')
+ def test_detail_by_custom_slug(self):
+ res = self.client.get('/detail/author/bycustomslug/scott-rosenberg/')
+ self.assertEqual(res.status_code, 200)
+ self.assertEqual(res.context['object'], Author.objects.get(slug='scott-rosenberg'))
+ self.assertEqual(res.context['author'], Author.objects.get(slug='scott-rosenberg'))
+ self.assertTemplateUsed(res, 'generic_views/author_detail.html')
+
def test_verbose_name(self):
res = self.client.get('/detail/artist/1/')
self.assertEqual(res.status_code, 200)
View
4 tests/regressiontests/generic_views/urls.py
@@ -30,8 +30,12 @@
url(r'^detail/author/(?P<pk>\d+)/$',
views.AuthorDetail.as_view(),
name="author_detail"),
+ (r'^detail/author/bycustompk/(?P<foo>\d+)/$',
+ views.AuthorDetail.as_view(pk_url_kwarg='foo')),
(r'^detail/author/byslug/(?P<slug>[\w-]+)/$',
views.AuthorDetail.as_view()),
+ (r'^detail/author/bycustomslug/(?P<foo>[\w-]+)/$',
+ views.AuthorDetail.as_view(slug_url_kwarg='foo')),
(r'^detail/author/(?P<pk>\d+)/template_name_suffix/$',
views.AuthorDetail.as_view(template_name_suffix='_view')),
(r'^detail/author/(?P<pk>\d+)/template_name/$',
Please sign in to comment.
Something went wrong with that request. Please try again.