diff --git a/django/db/models/base.py b/django/db/models/base.py index c330b6c0857..807137fb575 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -15,7 +15,7 @@ from django.db.models import signals from django.db.models.loading import register_models, get_model from django.utils.translation import ugettext_lazy as _ import django.utils.copycompat as copy -from django.utils.functional import curry +from django.utils.functional import curry, update_wrapper from django.utils.encoding import smart_str, force_unicode, smart_unicode from django.utils.text import get_text_list, capfirst from django.conf import settings @@ -232,7 +232,8 @@ class ModelBase(type): cls.__doc__ = "%s(%s)" % (cls.__name__, ", ".join([f.attname for f in opts.fields])) if hasattr(cls, 'get_absolute_url'): - cls.get_absolute_url = curry(get_absolute_url, opts, cls.get_absolute_url) + cls.get_absolute_url = update_wrapper(curry(get_absolute_url, opts, cls.get_absolute_url), + cls.get_absolute_url) signals.class_prepared.send(sender=cls) diff --git a/tests/regressiontests/views/models.py b/tests/regressiontests/views/models.py index d96a13127e6..54f5c1c1f0a 100644 --- a/tests/regressiontests/views/models.py +++ b/tests/regressiontests/views/models.py @@ -39,6 +39,7 @@ class UrlArticle(BaseArticle): def get_absolute_url(self): return '/urlarticles/%s/' % self.slug + get_absolute_url.purge = True class DateArticle(BaseArticle): """ diff --git a/tests/regressiontests/views/tests/defaults.py b/tests/regressiontests/views/tests/defaults.py index 1d1b3c35012..0aefe481e89 100644 --- a/tests/regressiontests/views/tests/defaults.py +++ b/tests/regressiontests/views/tests/defaults.py @@ -4,7 +4,7 @@ from django.conf import settings from django.test import TestCase from django.contrib.contenttypes.models import ContentType -from regressiontests.views.models import Author, Article +from regressiontests.views.models import Author, Article, UrlArticle class DefaultsTests(TestCase): """Test django views in django/views/defaults.py""" @@ -15,7 +15,7 @@ class DefaultsTests(TestCase): for obj in Author.objects.all(): short_url = '/views/shortcut/%s/%s/' % (ContentType.objects.get_for_model(Author).id, obj.pk) response = self.client.get(short_url) - self.assertRedirects(response, 'http://testserver%s' % obj.get_absolute_url(), + self.assertRedirects(response, 'http://testserver%s' % obj.get_absolute_url(), status_code=302, target_status_code=404) def test_shortcut_no_absolute_url(self): @@ -59,3 +59,11 @@ class DefaultsTests(TestCase): "The server_error view raises a 500 status" response = self.client.get('/views/server_error/') self.assertEquals(response.status_code, 500) + + def test_get_absolute_url_attributes(self): + "A model can set attributes on the get_absolute_url method" + self.assertTrue(getattr(UrlArticle.get_absolute_url, 'purge', False), + 'The attributes of the original get_absolute_url must be added.') + article = UrlArticle.objects.get(pk=1) + self.assertTrue(getattr(article.get_absolute_url, 'purge', False), + 'The attributes of the original get_absolute_url must be added.')