mirror of https://github.com/django/django.git
Fixed #17911 -- Ensure that admin readonly fields' display values are shown in change forms when the raw value is None.
This commit is contained in:
parent
05dbc07c52
commit
29d59a879e
|
@ -186,9 +186,7 @@ class AdminReadonlyField(object):
|
|||
if getattr(attr, "allow_tags", False):
|
||||
result_repr = mark_safe(result_repr)
|
||||
else:
|
||||
if value is None:
|
||||
result_repr = EMPTY_CHANGELIST_VALUE
|
||||
elif isinstance(f.rel, ManyToManyRel):
|
||||
if isinstance(f.rel, ManyToManyRel) and value is not None:
|
||||
result_repr = ", ".join(map(six.text_type, value.all()))
|
||||
else:
|
||||
result_repr = display_for_field(value, f)
|
||||
|
|
|
@ -27,7 +27,7 @@ from .models import (Article, Chapter, Account, Media, Child, Parent, Picture,
|
|||
Album, Question, Answer, ComplexSortedPerson, PrePopulatedPostLargeSlug,
|
||||
AdminOrderedField, AdminOrderedModelMethod, AdminOrderedAdminMethod,
|
||||
AdminOrderedCallable, Report, Color2, UnorderedObject, MainPrepopulated,
|
||||
RelatedPrepopulated, UndeletableObject, UserMessenger, Simple)
|
||||
RelatedPrepopulated, UndeletableObject, UserMessenger, Simple, Choice)
|
||||
|
||||
|
||||
def callable_year(dt_value):
|
||||
|
@ -615,6 +615,12 @@ class MessageTestingAdmin(admin.ModelAdmin):
|
|||
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.register(Article, ArticleAdmin)
|
||||
site.register(CustomArticle, CustomArticleAdmin)
|
||||
|
@ -690,6 +696,7 @@ site.register(AdminOrderedCallable, AdminOrderedCallableAdmin)
|
|||
site.register(Color2, CustomTemplateFilterColorAdmin)
|
||||
site.register(Simple, AttributeErrorRaisingAdmin)
|
||||
site.register(UserMessenger, MessageTestingAdmin)
|
||||
site.register(Choice, ChoiceList)
|
||||
|
||||
# Register core models we need in our tests
|
||||
from django.contrib.auth.models import User, Group
|
||||
|
|
|
@ -660,3 +660,7 @@ class Simple(models.Model):
|
|||
"""
|
||||
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')))
|
||||
|
|
|
@ -46,7 +46,7 @@ from .models import (Article, BarAccount, CustomArticle, EmptyModel, FooAccount,
|
|||
OtherStory, ComplexSortedPerson, Parent, Child, AdminOrderedField,
|
||||
AdminOrderedModelMethod, AdminOrderedAdminMethod, AdminOrderedCallable,
|
||||
Report, MainPrepopulated, RelatedPrepopulated, UnorderedObject,
|
||||
Simple, UndeletableObject)
|
||||
Simple, UndeletableObject, Choice)
|
||||
|
||||
|
||||
ERROR_MESSAGE = "Please enter the correct username and password \
|
||||
|
@ -3202,6 +3202,15 @@ class ReadonlyTest(TestCase):
|
|||
response = self.client.get('/test_admin/admin2/auth/user/%s/password/' % su.pk)
|
||||
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',))
|
||||
class RawIdFieldsTest(TestCase):
|
||||
|
|
Loading…
Reference in New Issue