Fixed #29929 -- Fixed admin view-only change form crash when using ModelAdmin.prepopulated_fields.
This commit is contained in:
parent
682cdf6cab
commit
7d1123e5ad
|
@ -1585,7 +1585,8 @@ class ModelAdmin(BaseModelAdmin):
|
||||||
adminForm = helpers.AdminForm(
|
adminForm = helpers.AdminForm(
|
||||||
form,
|
form,
|
||||||
list(self.get_fieldsets(request, obj)),
|
list(self.get_fieldsets(request, obj)),
|
||||||
self.get_prepopulated_fields(request, obj),
|
# Clear prepopulated fields on a view-only form to avoid a crash.
|
||||||
|
self.get_prepopulated_fields(request, obj) if add or self.has_change_permission(request, obj) else {},
|
||||||
readonly_fields,
|
readonly_fields,
|
||||||
model_admin=self)
|
model_admin=self)
|
||||||
media = self.media + adminForm.media
|
media = self.media + adminForm.media
|
||||||
|
|
|
@ -19,3 +19,6 @@ Bugfixes
|
||||||
|
|
||||||
* Fixed keep-alive support in ``runserver`` after it was disabled to fix
|
* Fixed keep-alive support in ``runserver`` after it was disabled to fix
|
||||||
another issue in Django 2.0 (:ticket:`29849`).
|
another issue in Django 2.0 (:ticket:`29849`).
|
||||||
|
|
||||||
|
* Fixed admin view-only change form crash when using
|
||||||
|
``ModelAdmin.prepopulated_fields`` (:ticket:`29929`).
|
||||||
|
|
|
@ -459,6 +459,13 @@ class PrePopulatedPostAdmin(admin.ModelAdmin):
|
||||||
return self.prepopulated_fields
|
return self.prepopulated_fields
|
||||||
|
|
||||||
|
|
||||||
|
class PrePopulatedPostReadOnlyAdmin(admin.ModelAdmin):
|
||||||
|
prepopulated_fields = {'slug': ('title',)}
|
||||||
|
|
||||||
|
def has_change_permission(self, *args, **kwargs):
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
class PostAdmin(admin.ModelAdmin):
|
class PostAdmin(admin.ModelAdmin):
|
||||||
list_display = ['title', 'public']
|
list_display = ['title', 'public']
|
||||||
readonly_fields = (
|
readonly_fields = (
|
||||||
|
@ -1085,6 +1092,7 @@ site2.register(Person, save_as_continue=False)
|
||||||
site7 = admin.AdminSite(name="admin7")
|
site7 = admin.AdminSite(name="admin7")
|
||||||
site7.register(Article, ArticleAdmin2)
|
site7.register(Article, ArticleAdmin2)
|
||||||
site7.register(Section)
|
site7.register(Section)
|
||||||
|
site7.register(PrePopulatedPost, PrePopulatedPostReadOnlyAdmin)
|
||||||
|
|
||||||
|
|
||||||
# Used to test ModelAdmin.sortable_by and get_sortable_by().
|
# Used to test ModelAdmin.sortable_by and get_sortable_by().
|
||||||
|
|
|
@ -4211,6 +4211,25 @@ class PrePopulatedTest(TestCase):
|
||||||
response = self.client.get(reverse('admin:admin_views_prepopulatedpostlargeslug_add'))
|
response = self.client.get(reverse('admin:admin_views_prepopulatedpostlargeslug_add'))
|
||||||
self.assertContains(response, ""maxLength": 1000") # instead of 1,000
|
self.assertContains(response, ""maxLength": 1000") # instead of 1,000
|
||||||
|
|
||||||
|
def test_view_only_add_form(self):
|
||||||
|
"""
|
||||||
|
PrePopulatedPostReadOnlyAdmin.prepopulated_fields includes 'slug'
|
||||||
|
which is present in the add view, even if the
|
||||||
|
ModelAdmin.has_change_permission() returns False.
|
||||||
|
"""
|
||||||
|
response = self.client.get(reverse('admin7:admin_views_prepopulatedpost_add'))
|
||||||
|
self.assertContains(response, 'data-prepopulated-fields=')
|
||||||
|
self.assertContains(response, '"id": "#id_slug"')
|
||||||
|
|
||||||
|
def test_view_only_change_form(self):
|
||||||
|
"""
|
||||||
|
PrePopulatedPostReadOnlyAdmin.prepopulated_fields includes 'slug'. That
|
||||||
|
doesn't break a view-only change view.
|
||||||
|
"""
|
||||||
|
response = self.client.get(reverse('admin7:admin_views_prepopulatedpost_change', args=(self.p1.pk,)))
|
||||||
|
self.assertContains(response, 'data-prepopulated-fields="[]"')
|
||||||
|
self.assertContains(response, '<div class="readonly">%s</div>' % self.p1.slug)
|
||||||
|
|
||||||
|
|
||||||
@override_settings(ROOT_URLCONF='admin_views.urls')
|
@override_settings(ROOT_URLCONF='admin_views.urls')
|
||||||
class SeleniumTests(AdminSeleniumTestCase):
|
class SeleniumTests(AdminSeleniumTestCase):
|
||||||
|
|
Loading…
Reference in New Issue