diff --git a/django/contrib/admin/util.py b/django/contrib/admin/util.py index e606f9f28a..00a9a91ead 100644 --- a/django/contrib/admin/util.py +++ b/django/contrib/admin/util.py @@ -1,4 +1,5 @@ from django.db import models +from django.db.models.related import RelatedObject from django.forms.forms import pretty_name from django.utils import formats from django.utils.html import escape @@ -278,7 +279,11 @@ def lookup_field(name, obj, model_admin=None): def label_for_field(name, model, model_admin=None, return_attr=False): attr = None 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: if name == "__unicode__": label = force_unicode(model._meta.verbose_name) diff --git a/tests/regressiontests/admin_util/models.py b/tests/regressiontests/admin_util/models.py index 493e1271ad..3191a55a2b 100644 --- a/tests/regressiontests/admin_util/models.py +++ b/tests/regressiontests/admin_util/models.py @@ -1,7 +1,5 @@ from django.db import models - - class Article(models.Model): """ A simple Article model for testing @@ -20,3 +18,16 @@ class Article(models.Model): class Count(models.Model): 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" diff --git a/tests/regressiontests/admin_util/tests.py b/tests/regressiontests/admin_util/tests.py index 6979a7a573..518a16d151 100644 --- a/tests/regressiontests/admin_util/tests.py +++ b/tests/regressiontests/admin_util/tests.py @@ -11,7 +11,7 @@ from django.test import TestCase from django.utils import unittest from django.utils.formats import localize -from models import Article, Count +from models import Article, Count, Event, Location class NestedObjectsTests(TestCase): @@ -219,3 +219,20 @@ class UtilTests(unittest.TestCase): ), ("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), + )