Fixed #13174 -- Fixed missing field label for `readonly_fields` when used in `StackedInline`, thanks to benc for the report and ptone for the investigation and initial patch.

* Corrected `InlineAdminForm.__init__` to pass along `model_admin` parameter in `super` call.
 * Lookup the field label in the form's model, not the `model_admin` model.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@12857 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Gary Wilson Jr 2010-03-26 23:38:05 +00:00
parent 459c71e332
commit 84de614529
3 changed files with 15 additions and 3 deletions

View File

@ -140,7 +140,7 @@ class AdminReadonlyField(object):
if not self.is_first: if not self.is_first:
attrs["class"] = "inline" attrs["class"] = "inline"
name = forms.forms.pretty_name( name = forms.forms.pretty_name(
label_for_field(self.field, self.model_admin.model, self.model_admin) label_for_field(self.field, self.form._meta.model, self.model_admin)
) )
contents = force_unicode(escape(name)) + u":" contents = force_unicode(escape(name)) + u":"
return mark_safe('<label%(attrs)s>%(contents)s</label>' % { return mark_safe('<label%(attrs)s>%(contents)s</label>' % {
@ -232,7 +232,7 @@ class InlineAdminForm(AdminForm):
self.original_content_type_id = ContentType.objects.get_for_model(original).pk self.original_content_type_id = ContentType.objects.get_for_model(original).pk
self.show_url = original and hasattr(original, 'get_absolute_url') self.show_url = original and hasattr(original, 'get_absolute_url')
super(InlineAdminForm, self).__init__(form, fieldsets, prepopulated_fields, super(InlineAdminForm, self).__init__(form, fieldsets, prepopulated_fields,
readonly_fields) readonly_fields, model_admin)
def __iter__(self): def __iter__(self):
for name, options in self.fieldsets: for name, options in self.fieldsets:

View File

@ -38,11 +38,13 @@ class Holder(models.Model):
class Inner(models.Model): class Inner(models.Model):
dummy = models.IntegerField() dummy = models.IntegerField()
holder = models.ForeignKey(Holder) holder = models.ForeignKey(Holder)
readonly = models.CharField("Inner readonly label", max_length=1)
class InnerInline(admin.StackedInline): class InnerInline(admin.StackedInline):
model = Inner model = Inner
can_delete = False can_delete = False
readonly_fields = ('readonly',) # For bug #13174 tests.
class Holder2(models.Model): class Holder2(models.Model):

View File

@ -4,6 +4,7 @@ from django.test import TestCase
from models import Holder, Inner, InnerInline from models import Holder, Inner, InnerInline
from models import Holder2, Inner2, Holder3, Inner3 from models import Holder2, Inner2, Holder3, Inner3
class TestInline(TestCase): class TestInline(TestCase):
fixtures = ['admin-views-users.xml'] fixtures = ['admin-views-users.xml']
@ -29,6 +30,15 @@ class TestInline(TestCase):
actual = inner_formset.can_delete actual = inner_formset.can_delete
self.assertEqual(expected, actual, 'can_delete must be equal') self.assertEqual(expected, actual, 'can_delete must be equal')
def test_readonly_stacked_inline_label(self):
"""Bug #13174."""
holder = Holder.objects.create(dummy=42)
inner = Inner.objects.create(holder=holder, dummy=42, readonly='')
response = self.client.get('/test_admin/admin/admin_inlines/holder/%i/'
% holder.id)
self.assertContains(response, '<label>Inner readonly label:</label>')
class TestInlineMedia(TestCase): class TestInlineMedia(TestCase):
fixtures = ['admin-views-users.xml'] fixtures = ['admin-views-users.xml']
@ -63,4 +73,4 @@ class TestInlineMedia(TestCase):
change_url = '/test_admin/admin/admin_inlines/holder2/%i/' % holder.id change_url = '/test_admin/admin/admin_inlines/holder2/%i/' % holder.id
response = self.client.get(change_url) response = self.client.get(change_url)
self.assertContains(response, 'my_awesome_admin_scripts.js') self.assertContains(response, 'my_awesome_admin_scripts.js')
self.assertContains(response, 'my_awesome_inline_scripts.js') self.assertContains(response, 'my_awesome_inline_scripts.js')