[1.2.X] Fixed #13963 -- Use the correct verbose name of a reverse relation field in the admin. Thanks, sfllaw and d0ugal.

Backport from trunk (r14244).

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@14245 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jannis Leidel 2010-10-17 15:40:41 +00:00
parent 2a33115040
commit 0e4737ec24
3 changed files with 37 additions and 4 deletions

View File

@ -1,5 +1,6 @@
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.db import models from django.db import models
from django.db.models.related import RelatedObject
from django.forms.forms import pretty_name from django.forms.forms import pretty_name
from django.utils import formats from django.utils import formats
from django.utils.html import escape from django.utils.html import escape
@ -279,7 +280,11 @@ def lookup_field(name, obj, model_admin=None):
def label_for_field(name, model, model_admin=None, return_attr=False): def label_for_field(name, model, model_admin=None, return_attr=False):
attr = None attr = None
try: try:
label = model._meta.get_field_by_name(name)[0].verbose_name field = model._meta.get_field_by_name(name)[0]
if isinstance(field, RelatedObject):
label = field.opts.verbose_name
else:
label = field.verbose_name
except models.FieldDoesNotExist: except models.FieldDoesNotExist:
if name == "__unicode__": if name == "__unicode__":
label = force_unicode(model._meta.verbose_name) label = force_unicode(model._meta.verbose_name)

View File

@ -1,7 +1,5 @@
from django.db import models from django.db import models
class Article(models.Model): class Article(models.Model):
""" """
A simple Article model for testing A simple Article model for testing
@ -20,3 +18,16 @@ class Article(models.Model):
class Count(models.Model): class Count(models.Model):
num = models.PositiveSmallIntegerField() num = models.PositiveSmallIntegerField()
class Event(models.Model):
date = models.DateTimeField(auto_now_add=True)
class Location(models.Model):
event = models.OneToOneField(Event, verbose_name='awesome event')
class Guest(models.Model):
event = models.OneToOneField(Event)
name = models.CharField(max_length=255)
class Meta:
verbose_name = "awesome guest"

View File

@ -12,7 +12,7 @@ from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
from django.contrib.admin.util import NestedObjects from django.contrib.admin.util import NestedObjects
from models import Article, Count from models import Article, Count, Event, Location
class NestedObjectsTests(TestCase): class NestedObjectsTests(TestCase):
@ -220,3 +220,20 @@ class UtilTests(unittest.TestCase):
), ),
("not Really the Model", MockModelAdmin.test_from_model) ("not Really the Model", MockModelAdmin.test_from_model)
) )
def test_related_name(self):
"""
Regression test for #13963
"""
self.assertEquals(
label_for_field('location', Event, return_attr=True),
('location', None),
)
self.assertEquals(
label_for_field('event', Location, return_attr=True),
('awesome event', None),
)
self.assertEquals(
label_for_field('guest', Event, return_attr=True),
('awesome guest', None),
)