Fixed #32219 -- Made InlineModelAdmin.verbose_name_plural fallback to its verbose_name.

This commit is contained in:
Siburg 2020-11-23 17:37:53 +13:00 committed by Mariusz Felisiak
parent 1bd6a7a0ac
commit 46c8df640c
4 changed files with 67 additions and 6 deletions

View File

@ -2037,10 +2037,13 @@ class InlineModelAdmin(BaseModelAdmin):
self.opts = self.model._meta
self.has_registered_model = admin_site.is_registered(self.model)
super().__init__()
if self.verbose_name_plural is None:
if self.verbose_name is None:
self.verbose_name_plural = self.model._meta.verbose_name_plural
else:
self.verbose_name_plural = format_lazy('{}s', self.verbose_name)
if self.verbose_name is None:
self.verbose_name = self.model._meta.verbose_name
if self.verbose_name_plural is None:
self.verbose_name_plural = self.model._meta.verbose_name_plural
@property
def media(self):

View File

@ -2453,13 +2453,19 @@ The ``InlineModelAdmin`` class adds or customizes:
.. attribute:: InlineModelAdmin.verbose_name
An override to the ``verbose_name`` found in the model's inner ``Meta``
class.
An override to the :attr:`~django.db.models.Options.verbose_name` from the
model's inner ``Meta`` class.
.. attribute:: InlineModelAdmin.verbose_name_plural
An override to the ``verbose_name_plural`` found in the model's inner
``Meta`` class.
An override to the :attr:`~django.db.models.Options.verbose_name_plural`
from the model's inner ``Meta`` class. If this isn't given and the
:attr:`.InlineModelAdmin.verbose_name` is defined, Django will use
:attr:`.InlineModelAdmin.verbose_name` + ``'s'``.
.. versionchanged:: 4.0
The fallback to :attr:`.InlineModelAdmin.verbose_name` was added.
.. attribute:: InlineModelAdmin.can_delete

View File

@ -85,6 +85,9 @@ Minor features
* The new :attr:`.ModelAdmin.search_help_text` attribute allows specifying a
descriptive text for the search box.
* The :attr:`.InlineModelAdmin.verbose_name_plural` attribute now fallbacks to
the :attr:`.InlineModelAdmin.verbose_name` + ``'s'``.
:mod:`django.contrib.admindocs`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -967,6 +967,55 @@ class TestReadOnlyChangeViewInlinePermissions(TestCase):
class TestVerboseNameInlineForms(TestDataMixin, TestCase):
factory = RequestFactory()
def test_verbose_name_inline(self):
class NonVerboseProfileInline(TabularInline):
model = Profile
verbose_name = 'Non-verbose childs'
class VerboseNameProfileInline(TabularInline):
model = VerboseNameProfile
verbose_name = 'Childs with verbose name'
class VerboseNamePluralProfileInline(TabularInline):
model = VerboseNamePluralProfile
verbose_name = 'Childs with verbose name plural'
class BothVerboseNameProfileInline(TabularInline):
model = BothVerboseNameProfile
verbose_name = 'Childs with both verbose names'
modeladmin = ModelAdmin(ProfileCollection, admin_site)
modeladmin.inlines = [
NonVerboseProfileInline,
VerboseNameProfileInline,
VerboseNamePluralProfileInline,
BothVerboseNameProfileInline,
]
obj = ProfileCollection.objects.create()
url = reverse('admin:admin_inlines_profilecollection_change', args=(obj.pk,))
request = self.factory.get(url)
request.user = self.superuser
response = modeladmin.changeform_view(request)
self.assertNotContains(response, 'Add another Profile')
# Non-verbose model.
self.assertContains(response, '<h2>Non-verbose childss</h2>')
self.assertContains(response, 'Add another Non-verbose child')
self.assertNotContains(response, '<h2>Profiles</h2>')
# Model with verbose name.
self.assertContains(response, '<h2>Childs with verbose names</h2>')
self.assertContains(response, 'Add another Childs with verbose name')
self.assertNotContains(response, '<h2>Model with verbose name onlys</h2>')
self.assertNotContains(response, 'Add another Model with verbose name only')
# Model with verbose name plural.
self.assertContains(response, '<h2>Childs with verbose name plurals</h2>')
self.assertContains(response, 'Add another Childs with verbose name plural')
self.assertNotContains(response, '<h2>Model with verbose name plural only</h2>')
# Model with both verbose names.
self.assertContains(response, '<h2>Childs with both verbose namess</h2>')
self.assertContains(response, 'Add another Childs with both verbose names')
self.assertNotContains(response, '<h2>Model with both - plural name</h2>')
self.assertNotContains(response, 'Add another Model with both - name')
def test_verbose_name_plural_inline(self):
class NonVerboseProfileInline(TabularInline):
model = Profile