Skip to content

Commit

Permalink
Fixed #22087 -- Made AdminReadonlyField respect ModelForm Meta overri…
Browse files Browse the repository at this point in the history
…des.
  • Loading branch information
bendavis78 authored and timgraham committed Mar 25, 2014
1 parent 35ed792 commit 16affff
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 4 deletions.
14 changes: 12 additions & 2 deletions django/contrib/admin/helpers.py
Expand Up @@ -136,19 +136,29 @@ def errors(self):

class AdminReadonlyField(object):
def __init__(self, form, field, is_first, model_admin=None):
label = label_for_field(field, form._meta.model, model_admin)
# 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__ if field.__name__ != '<lambda>' else ''
else:
class_name = field

if form._meta.labels and class_name in form._meta.labels:
label = form._meta.labels[class_name]
else:
label = label_for_field(field, form._meta.model, model_admin)

if form._meta.help_texts and class_name in form._meta.help_texts:
help_text = form._meta.help_texts[class_name]
else:
help_text = help_text_for_field(class_name, form._meta.model)

self.field = {
'name': class_name,
'label': label,
'help_text': help_text,
'field': field,
'help_text': help_text_for_field(class_name, form._meta.model)
}
self.form = form
self.model_admin = model_admin
Expand Down
19 changes: 18 additions & 1 deletion tests/admin_views/admin.py
Expand Up @@ -35,7 +35,7 @@
UnchangeableObject, UserMessenger, Simple, Choice, ShortMessage, Telegram,
FilteredManager, EmptyModelHidden, EmptyModelVisible, EmptyModelMixin,
State, City, Restaurant, Worker, ParentWithDependentChildren,
DependentChild, StumpJoke)
DependentChild, StumpJoke, FieldOverridePost)


def callable_year(dt_value):
Expand Down Expand Up @@ -435,6 +435,22 @@ def multiline_html(self, instance):
value.short_description = 'Value in $US'


class FieldOverridePostForm(forms.ModelForm):
model = FieldOverridePost

class Meta:
help_texts = {
'posted': 'Overridden help text for the date',
}
labels = {
'public': 'Overridden public label',
}


class FieldOverridePostAdmin(PostAdmin):
form = FieldOverridePostForm


class CustomChangeList(ChangeList):
def get_queryset(self, request):
return self.root_queryset.filter(pk=9999) # Does not exist
Expand Down Expand Up @@ -833,6 +849,7 @@ def get_changeform_initial_data(self, request):
site.register(Collector, CollectorAdmin)
site.register(Category, CategoryAdmin)
site.register(Post, PostAdmin)
site.register(FieldOverridePost, FieldOverridePostAdmin)
site.register(Gadget, GadgetAdmin)
site.register(Villain)
site.register(SuperVillain)
Expand Down
7 changes: 7 additions & 0 deletions tests/admin_views/models.py
Expand Up @@ -438,6 +438,13 @@ def awesomeness_level(self):
return "Very awesome."


# Proxy model to test overridden fields attrs on Post model so as not to
# interfere with other tests.
class FieldOverridePost(Post):
class Meta:
proxy = True


@python_2_unicode_compatible
class Gadget(models.Model):
name = models.CharField(max_length=100)
Expand Down
14 changes: 13 additions & 1 deletion tests/admin_views/tests.py
Expand Up @@ -52,7 +52,7 @@
Report, MainPrepopulated, RelatedPrepopulated, UnorderedObject,
Simple, UndeletableObject, UnchangeableObject, Choice, ShortMessage,
Telegram, Pizza, Topping, FilteredManager, City, Restaurant, Worker,
ParentWithDependentChildren, Character)
ParentWithDependentChildren, Character, FieldOverridePost)
from .admin import site, site2, CityAdmin


Expand Down Expand Up @@ -3693,6 +3693,18 @@ def test_readonly_backwards_ref(self):
response = self.client.get('/test_admin/admin/admin_views/topping/add/')
self.assertEqual(response.status_code, 200)

def test_readonly_field_overrides(self):
"""
Regression test for #22087 - ModelForm Meta overrides are ignored by
AdminReadonlyField
"""
p = FieldOverridePost.objects.create(title="Test Post", content="Test Content")
response = self.client.get('/test_admin/admin/admin_views/fieldoverridepost/%d/' % p.pk)
self.assertEqual(response.status_code, 200)
self.assertContains(response, '<p class="help">Overridden help text for the date</p>')
self.assertContains(response, '<label for="id_public">Overridden public label:</label>', html=True)
self.assertNotContains(response, "Some help text for the date (with unicode ŠĐĆŽćžšđ)")


@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',))
class LimitChoicesToInAdminTest(TestCase):
Expand Down

0 comments on commit 16affff

Please sign in to comment.