Skip to content

Commit

Permalink
[1.5.x] Fixed #17911 -- Ensure that admin readonly fields' display va…
Browse files Browse the repository at this point in the history
…lues are shown in change forms when the raw value is None.

Backport of 29d59a8
  • Loading branch information
edwtjo authored and jphalip committed Nov 25, 2012
1 parent 22ca5ba commit 7c91b67
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 5 deletions.
4 changes: 1 addition & 3 deletions django/contrib/admin/helpers.py
Expand Up @@ -186,9 +186,7 @@ def contents(self):
if getattr(attr, "allow_tags", False): if getattr(attr, "allow_tags", False):
result_repr = mark_safe(result_repr) result_repr = mark_safe(result_repr)
else: else:
if value is None: if isinstance(f.rel, ManyToManyRel) and value is not None:
result_repr = EMPTY_CHANGELIST_VALUE
elif isinstance(f.rel, ManyToManyRel):
result_repr = ", ".join(map(six.text_type, value.all())) result_repr = ", ".join(map(six.text_type, value.all()))
else: else:
result_repr = display_for_field(value, f) result_repr = display_for_field(value, f)
Expand Down
9 changes: 8 additions & 1 deletion tests/regressiontests/admin_views/admin.py
Expand Up @@ -27,7 +27,7 @@
Album, Question, Answer, ComplexSortedPerson, PrePopulatedPostLargeSlug, Album, Question, Answer, ComplexSortedPerson, PrePopulatedPostLargeSlug,
AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod, AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod,
AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated, AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated,
RelatedPrepopulated, UndeletableObject, UserMessenger, Simple) RelatedPrepopulated, UndeletableObject, UserMessenger, Simple, Choice)




def callable_year(dt_value): def callable_year(dt_value):
Expand Down Expand Up @@ -615,6 +615,12 @@ def message_extra_tags(self, request, selected):
self.message_user(request, "Test tags", extra_tags="extra_tag") self.message_user(request, "Test tags", extra_tags="extra_tag")




class ChoiceList(admin.ModelAdmin):
list_display = ['choice']
readonly_fields = ['choice']
fields = ['choice']


site = admin.AdminSite(name="admin") site = admin.AdminSite(name="admin")
site.register(Article, ArticleAdmin) site.register(Article, ArticleAdmin)
site.register(CustomArticle, CustomArticleAdmin) site.register(CustomArticle, CustomArticleAdmin)
Expand Down Expand Up @@ -690,6 +696,7 @@ def message_extra_tags(self, request, selected):
site.register(Color2, CustomTemplateFilterColorAdmin) site.register(Color2, CustomTemplateFilterColorAdmin)
site.register(Simple, AttributeErrorRaisingAdmin) site.register(Simple, AttributeErrorRaisingAdmin)
site.register(UserMessenger, MessageTestingAdmin) site.register(UserMessenger, MessageTestingAdmin)
site.register(Choice, ChoiceList)


# Register core models we need in our tests # Register core models we need in our tests
from django.contrib.auth.models import User, Group from django.contrib.auth.models import User, Group
Expand Down
4 changes: 4 additions & 0 deletions tests/regressiontests/admin_views/models.py
Expand Up @@ -660,3 +660,7 @@ class Simple(models.Model):
""" """
Simple model with nothing on it for use in testing Simple model with nothing on it for use in testing
""" """

class Choice(models.Model):
choice = models.CharField(max_length=1, blank=True, null=True,
choices=(('y','Yes'), ('n','No'), (None, 'No opinion')))
11 changes: 10 additions & 1 deletion tests/regressiontests/admin_views/tests.py
Expand Up @@ -46,7 +46,7 @@
OtherStory, ComplexSortedPerson, Parent, Child, AdminOrderedField, OtherStory, ComplexSortedPerson, Parent, Child, AdminOrderedField,
AdminOrderedModelMethod, AdminOrderedAdminMethod, AdminOrderedCallable, AdminOrderedModelMethod, AdminOrderedAdminMethod, AdminOrderedCallable,
Report, MainPrepopulated, RelatedPrepopulated, UnorderedObject, Report, MainPrepopulated, RelatedPrepopulated, UnorderedObject,
Simple, UndeletableObject) Simple, UndeletableObject, Choice)




ERROR_MESSAGE = "Please enter the correct username and password \ ERROR_MESSAGE = "Please enter the correct username and password \
Expand Down Expand Up @@ -3202,6 +3202,15 @@ def test_user_password_change_limited_queryset(self):
response = self.client.get('/test_admin/admin2/auth/user/%s/password/' % su.pk) response = self.client.get('/test_admin/admin2/auth/user/%s/password/' % su.pk)
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)


def test_change_form_renders_correct_null_choice_value(self):
"""
Regression test for #17911.
"""
choice = Choice.objects.create(choice=None)
response = self.client.get('/test_admin/admin/admin_views/choice/%s/' % choice.pk)
self.assertContains(response, '<p>No opinion</p>', html=True)
self.assertNotContains(response, '<p>(None)</p>')



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

0 comments on commit 7c91b67

Please sign in to comment.