mirror of https://github.com/django/django.git
Fixed #11891 -- Ensured that attributes of get_absolute_url are preserved through the metaclass. Thanks to nfg for the report and patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@12766 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
ef0be292a6
commit
203d0f6048
|
@ -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)
|
||||
|
||||
|
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
@ -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.')
|
||||
|
|
Loading…
Reference in New Issue