Fixed #32219 -- Made InlineModelAdmin.verbose_name_plural fallback to its verbose_name.
This commit is contained in:
parent
1bd6a7a0ac
commit
46c8df640c
|
@ -2037,10 +2037,13 @@ class InlineModelAdmin(BaseModelAdmin):
|
||||||
self.opts = self.model._meta
|
self.opts = self.model._meta
|
||||||
self.has_registered_model = admin_site.is_registered(self.model)
|
self.has_registered_model = admin_site.is_registered(self.model)
|
||||||
super().__init__()
|
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:
|
if self.verbose_name is None:
|
||||||
self.verbose_name = self.model._meta.verbose_name
|
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
|
@property
|
||||||
def media(self):
|
def media(self):
|
||||||
|
|
|
@ -2453,13 +2453,19 @@ The ``InlineModelAdmin`` class adds or customizes:
|
||||||
|
|
||||||
.. attribute:: InlineModelAdmin.verbose_name
|
.. attribute:: InlineModelAdmin.verbose_name
|
||||||
|
|
||||||
An override to the ``verbose_name`` found in the model's inner ``Meta``
|
An override to the :attr:`~django.db.models.Options.verbose_name` from the
|
||||||
class.
|
model's inner ``Meta`` class.
|
||||||
|
|
||||||
.. attribute:: InlineModelAdmin.verbose_name_plural
|
.. attribute:: InlineModelAdmin.verbose_name_plural
|
||||||
|
|
||||||
An override to the ``verbose_name_plural`` found in the model's inner
|
An override to the :attr:`~django.db.models.Options.verbose_name_plural`
|
||||||
``Meta`` class.
|
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
|
.. attribute:: InlineModelAdmin.can_delete
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,9 @@ Minor features
|
||||||
* The new :attr:`.ModelAdmin.search_help_text` attribute allows specifying a
|
* The new :attr:`.ModelAdmin.search_help_text` attribute allows specifying a
|
||||||
descriptive text for the search box.
|
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`
|
:mod:`django.contrib.admindocs`
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -967,6 +967,55 @@ class TestReadOnlyChangeViewInlinePermissions(TestCase):
|
||||||
class TestVerboseNameInlineForms(TestDataMixin, TestCase):
|
class TestVerboseNameInlineForms(TestDataMixin, TestCase):
|
||||||
factory = RequestFactory()
|
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):
|
def test_verbose_name_plural_inline(self):
|
||||||
class NonVerboseProfileInline(TabularInline):
|
class NonVerboseProfileInline(TabularInline):
|
||||||
model = Profile
|
model = Profile
|
||||||
|
|
Loading…
Reference in New Issue