diff --git a/django/contrib/admin/helpers.py b/django/contrib/admin/helpers.py index c38023b6fd..52d01839cc 100644 --- a/django/contrib/admin/helpers.py +++ b/django/contrib/admin/helpers.py @@ -7,6 +7,7 @@ from django.core.exceptions import ObjectDoesNotExist from django.db.models.fields import FieldDoesNotExist from django.db.models.fields.related import ManyToManyRel from django.forms.util import flatatt +from django.template.defaultfilters import capfirst from django.utils.encoding import force_unicode, smart_unicode from django.utils.html import escape, conditional_escape from django.utils.safestring import mark_safe @@ -132,8 +133,12 @@ class AdminReadonlyField(object): # Make self.field look a little bit like a field. This means that # {{ field.name }} must be a useful class name to identify the field. # For convenience, store other field-related data here too. + if callable(field): + class_name = field.__name__ != '' and field.__name__ or '' + else: + class_name = field self.field = { - 'name': force_unicode(label != '--' and label or ''), + 'name': class_name, 'label': label, 'field': field, } @@ -147,8 +152,8 @@ class AdminReadonlyField(object): attrs = {} if not self.is_first: attrs["class"] = "inline" - label = forms.forms.pretty_name(self.field['label']) - contents = force_unicode(escape(label)) + u":" + label = self.field['label'] + contents = capfirst(force_unicode(escape(label))) + u":" return mark_safe('%(contents)s' % { "attrs": flatatt(attrs), "contents": contents, @@ -213,7 +218,7 @@ class InlineAdminFormSet(object): continue if field in self.readonly_fields: label = label_for_field(field, self.opts.model, self.model_admin) - yield (False, forms.forms.pretty_name(label)) + yield (False, label) else: field = self.formset.form.base_fields[field] yield (field.widget.is_hidden, field.label) diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index b1ab7d543c..3f0b9c6360 100644 --- a/django/contrib/admin/templatetags/admin_list.py +++ b/django/contrib/admin/templatetags/admin_list.py @@ -88,7 +88,6 @@ def result_headers(cl): "class_attrib": mark_safe(' class="action-checkbox-column"') } continue - header = pretty_name(header) # It is a non-field, but perhaps one that is sortable admin_order_field = getattr(attr, "admin_order_field", None) diff --git a/django/contrib/admin/util.py b/django/contrib/admin/util.py index f727626a03..776a6f0f42 100644 --- a/django/contrib/admin/util.py +++ b/django/contrib/admin/util.py @@ -1,5 +1,6 @@ from django.core.exceptions import ObjectDoesNotExist from django.db import models +from django.forms.forms import pretty_name from django.utils import formats from django.utils.html import escape from django.utils.safestring import mark_safe @@ -303,9 +304,9 @@ def label_for_field(name, model, model_admin=None, return_attr=False): if attr.__name__ == "": label = "--" else: - label = attr.__name__ + label = pretty_name(attr.__name__) else: - label = name + label = pretty_name(name) if return_attr: return (label, attr) else: diff --git a/tests/regressiontests/admin_util/models.py b/tests/regressiontests/admin_util/models.py index e81f7bbc25..493e1271ad 100644 --- a/tests/regressiontests/admin_util/models.py +++ b/tests/regressiontests/admin_util/models.py @@ -16,7 +16,7 @@ class Article(models.Model): def test_from_model_with_override(self): return "nothing" - test_from_model_with_override.short_description = "not what you expect" + test_from_model_with_override.short_description = "not What you Expect" class Count(models.Model): num = models.PositiveSmallIntegerField() diff --git a/tests/regressiontests/admin_util/tests.py b/tests/regressiontests/admin_util/tests.py index f874b318f9..5ea0ac585e 100644 --- a/tests/regressiontests/admin_util/tests.py +++ b/tests/regressiontests/admin_util/tests.py @@ -157,7 +157,7 @@ class UtilTests(unittest.TestCase): "another name" ) self.assertEquals( - label_for_field("title2", Article, return_attr=True), + label_for_field("title2", Article, return_attr=True), ("another name", None) ) @@ -179,24 +179,24 @@ class UtilTests(unittest.TestCase): return "nothing" self.assertEquals( label_for_field(test_callable, Article), - "test_callable" + "Test callable" ) self.assertEquals( label_for_field(test_callable, Article, return_attr=True), - ("test_callable", test_callable) + ("Test callable", test_callable) ) self.assertEquals( label_for_field("test_from_model", Article), - "test_from_model" + "Test from model" ) self.assertEquals( label_for_field("test_from_model", Article, return_attr=True), - ("test_from_model", Article.test_from_model) + ("Test from model", Article.test_from_model) ) self.assertEquals( label_for_field("test_from_model_with_override", Article), - "not what you expect" + "not What you Expect" ) self.assertEquals( @@ -207,15 +207,16 @@ class UtilTests(unittest.TestCase): class MockModelAdmin(object): def test_from_model(self, obj): return "nothing" - test_from_model.short_description = "not really the model" + test_from_model.short_description = "not Really the Model" + self.assertEquals( label_for_field("test_from_model", Article, model_admin=MockModelAdmin), - "not really the model" + "not Really the Model" ) self.assertEquals( label_for_field("test_from_model", Article, model_admin = MockModelAdmin, return_attr = True ), - ("not really the model", MockModelAdmin.test_from_model) + ("not Really the Model", MockModelAdmin.test_from_model) ) diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py index be5782886f..a2700ba747 100644 --- a/tests/regressiontests/admin_views/models.py +++ b/tests/regressiontests/admin_views/models.py @@ -474,7 +474,7 @@ class Post(models.Model): class PostAdmin(admin.ModelAdmin): list_display = ['title', 'public'] - readonly_fields = ('posted', 'awesomeness_level', 'coolness', lambda obj: "foo") + readonly_fields = ('posted', 'awesomeness_level', 'coolness', 'value', lambda obj: "foo") inlines = [ LinkInline @@ -486,6 +486,9 @@ class PostAdmin(admin.ModelAdmin): else: return "Unkown coolness." + def value(self, instance): + return 1000 + value.short_description = 'Value in $US' class Gadget(models.Model): name = models.CharField(max_length=100) @@ -567,7 +570,7 @@ class CyclicTwo(models.Model): return self.name class Topping(models.Model): - name = models.CharField(max_length=20) + name = models.CharField(max_length=20) class Pizza(models.Model): name = models.CharField(max_length=20) diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 8749fee5ce..23964a949c 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -1970,6 +1970,7 @@ class ReadonlyTest(TestCase): self.assertContains(response, '
') self.assertContains(response, '
') self.assertContains(response, '
') + self.assertContains(response, '
') self.assertContains(response, '
') p = Post.objects.create(title="I worked on readonly_fields", content="Its good stuff")