Fixed #29414 -- Restored form inputs on admin inlines when the user doesn't have the change permission.
Regression in 825f0beda8
.
This commit is contained in:
parent
a7bc1aea03
commit
ffb72a95bc
|
@ -244,9 +244,10 @@ class InlineAdminFormSet:
|
||||||
self.has_view_permission = has_view_permission
|
self.has_view_permission = has_view_permission
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
readonly_fields_for_editing = self.readonly_fields
|
if self.has_change_permission:
|
||||||
if not self.has_change_permission:
|
readonly_fields_for_editing = self.readonly_fields
|
||||||
readonly_fields_for_editing += flatten_fieldsets(self.fieldsets)
|
else:
|
||||||
|
readonly_fields_for_editing = self.readonly_fields + flatten_fieldsets(self.fieldsets)
|
||||||
|
|
||||||
for form, original in zip(self.formset.initial_forms, self.formset.get_queryset()):
|
for form, original in zip(self.formset.initial_forms, self.formset.get_queryset()):
|
||||||
view_on_site_url = self.opts.get_view_on_site_url(original)
|
view_on_site_url = self.opts.get_view_on_site_url(original)
|
||||||
|
|
|
@ -7,9 +7,9 @@ from .models import (
|
||||||
Consigliere, EditablePKBook, ExtraTerrestrial, Fashionista, Holder,
|
Consigliere, EditablePKBook, ExtraTerrestrial, Fashionista, Holder,
|
||||||
Holder2, Holder3, Holder4, Inner, Inner2, Inner3, Inner4Stacked,
|
Holder2, Holder3, Holder4, Inner, Inner2, Inner3, Inner4Stacked,
|
||||||
Inner4Tabular, NonAutoPKBook, NonAutoPKBookChild, Novel,
|
Inner4Tabular, NonAutoPKBook, NonAutoPKBookChild, Novel,
|
||||||
ParentModelWithCustomPk, Poll, Profile, ProfileCollection, Question,
|
NovelReadonlyChapter, ParentModelWithCustomPk, Poll, Profile,
|
||||||
ReadOnlyInline, ShoppingWeakness, Sighting, SomeChildModel,
|
ProfileCollection, Question, ReadOnlyInline, ShoppingWeakness, Sighting,
|
||||||
SomeParentModel, SottoCapo, Title, TitleCollection,
|
SomeChildModel, SomeParentModel, SottoCapo, Title, TitleCollection,
|
||||||
)
|
)
|
||||||
|
|
||||||
site = admin.AdminSite(name="admin")
|
site = admin.AdminSite(name="admin")
|
||||||
|
@ -153,6 +153,17 @@ class NovelAdmin(admin.ModelAdmin):
|
||||||
inlines = [ChapterInline]
|
inlines = [ChapterInline]
|
||||||
|
|
||||||
|
|
||||||
|
class ReadOnlyChapterInline(admin.TabularInline):
|
||||||
|
model = Chapter
|
||||||
|
|
||||||
|
def has_change_permission(self, request, obj=None):
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class NovelReadonlyChapterAdmin(admin.ModelAdmin):
|
||||||
|
inlines = [ReadOnlyChapterInline]
|
||||||
|
|
||||||
|
|
||||||
class ConsigliereInline(admin.TabularInline):
|
class ConsigliereInline(admin.TabularInline):
|
||||||
model = Consigliere
|
model = Consigliere
|
||||||
|
|
||||||
|
@ -231,6 +242,7 @@ site.register(Holder3, inlines=[InnerInline3])
|
||||||
|
|
||||||
site.register(Poll, PollAdmin)
|
site.register(Poll, PollAdmin)
|
||||||
site.register(Novel, NovelAdmin)
|
site.register(Novel, NovelAdmin)
|
||||||
|
site.register(NovelReadonlyChapter, NovelReadonlyChapterAdmin)
|
||||||
site.register(Fashionista, inlines=[InlineWeakness])
|
site.register(Fashionista, inlines=[InlineWeakness])
|
||||||
site.register(Holder4, Holder4Admin)
|
site.register(Holder4, Holder4Admin)
|
||||||
site.register(Author, AuthorAdmin)
|
site.register(Author, AuthorAdmin)
|
||||||
|
|
|
@ -159,6 +159,12 @@ class Novel(models.Model):
|
||||||
name = models.CharField(max_length=40)
|
name = models.CharField(max_length=40)
|
||||||
|
|
||||||
|
|
||||||
|
class NovelReadonlyChapter(Novel):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
proxy = True
|
||||||
|
|
||||||
|
|
||||||
class Chapter(models.Model):
|
class Chapter(models.Model):
|
||||||
name = models.CharField(max_length=40)
|
name = models.CharField(max_length=40)
|
||||||
novel = models.ForeignKey(Novel, models.CASCADE)
|
novel = models.ForeignKey(Novel, models.CASCADE)
|
||||||
|
|
|
@ -447,6 +447,16 @@ class TestInline(TestDataMixin, TestCase):
|
||||||
self.assertTrue(response.context['inline_admin_formset'].opts.has_registered_model)
|
self.assertTrue(response.context['inline_admin_formset'].opts.has_registered_model)
|
||||||
self.assertNotContains(response, INLINE_CHANGELINK_HTML)
|
self.assertNotContains(response, INLINE_CHANGELINK_HTML)
|
||||||
|
|
||||||
|
def test_noneditable_inline_has_field_inputs(self):
|
||||||
|
"""Inlines without change permission shows field inputs on add form."""
|
||||||
|
response = self.client.get(reverse('admin:admin_inlines_novelreadonlychapter_add'))
|
||||||
|
self.assertContains(
|
||||||
|
response,
|
||||||
|
'<input type="text" name="chapter_set-0-name" '
|
||||||
|
'class="vTextField" maxlength="40" id="id_chapter_set-0-name">',
|
||||||
|
html=True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@override_settings(ROOT_URLCONF='admin_inlines.urls')
|
@override_settings(ROOT_URLCONF='admin_inlines.urls')
|
||||||
class TestInlineMedia(TestDataMixin, TestCase):
|
class TestInlineMedia(TestDataMixin, TestCase):
|
||||||
|
|
Loading…
Reference in New Issue