diff options
| author | Jon Dufresne <jon.dufresne@gmail.com> | 2020-09-08 15:39:43 -0700 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-09-11 06:28:45 +0200 |
| commit | 84609b3205905097d7d3038d32e6101f012c0619 (patch) | |
| tree | c5b733bf54a3765a62deaf92e96744c5409f5750 | |
| parent | cbe34dc8ecbd42de6db5caa9fa66b04fa4841636 (diff) | |
Fixed #31993 -- Added subtitles to admin change/view pages.
| -rw-r--r-- | django/contrib/admin/options.py | 2 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/base.html | 1 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/base_site.html | 2 | ||||
| -rw-r--r-- | tests/admin_views/tests.py | 57 |
4 files changed, 59 insertions, 3 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 2b02de84e4..bea685966e 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -1627,6 +1627,7 @@ class ModelAdmin(BaseModelAdmin): context = { **self.admin_site.each_context(request), 'title': title % opts.verbose_name, + 'subtitle': str(obj) if obj else None, 'adminform': adminForm, 'object_id': object_id, 'original': obj, @@ -1815,6 +1816,7 @@ class ModelAdmin(BaseModelAdmin): 'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(cl.result_list)}, 'selection_note_all': selection_note_all % {'total_count': cl.result_count}, 'title': cl.title, + 'subtitle': None, 'is_popup': cl.is_popup, 'to_field': cl.to_field, 'cl': cl, diff --git a/django/contrib/admin/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html index 3f39cd5b8f..d86f138da5 100644 --- a/django/contrib/admin/templates/admin/base.html +++ b/django/contrib/admin/templates/admin/base.html @@ -86,6 +86,7 @@ <div id="content" class="{% block coltype %}colM{% endblock %}"> {% block pretitle %}{% endblock %} {% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %} + {% block content_subtitle %}{% if subtitle %}<h2>{{ subtitle }}</h2>{% endif %}{% endblock %} {% block content %} {% block object-tools %}{% endblock %} {{ content }} diff --git a/django/contrib/admin/templates/admin/base_site.html b/django/contrib/admin/templates/admin/base_site.html index cae0a691e3..9e8cc604c5 100644 --- a/django/contrib/admin/templates/admin/base_site.html +++ b/django/contrib/admin/templates/admin/base_site.html @@ -1,6 +1,6 @@ {% extends "admin/base.html" %} -{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} +{% block title %}{% if subtitle %}{{ subtitle }} | {% endif %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} {% block branding %} <h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1> diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index 62aa236e2b..61894de9f0 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -100,10 +100,16 @@ class AdminViewBasicTestCase(TestCase): cls.superuser = User.objects.create_superuser(username='super', password='secret', email='super@example.com') cls.s1 = Section.objects.create(name='Test section') cls.a1 = Article.objects.create( - content='<p>Middle content</p>', date=datetime.datetime(2008, 3, 18, 11, 54, 58), section=cls.s1 + content='<p>Middle content</p>', + date=datetime.datetime(2008, 3, 18, 11, 54, 58), + section=cls.s1, + title='Article 1', ) cls.a2 = Article.objects.create( - content='<p>Oldest content</p>', date=datetime.datetime(2000, 3, 18, 11, 54, 58), section=cls.s1 + content='<p>Oldest content</p>', + date=datetime.datetime(2000, 3, 18, 11, 54, 58), + section=cls.s1, + title='Article 2', ) cls.a3 = Article.objects.create( content='<p>Newest content</p>', date=datetime.datetime(2009, 3, 18, 11, 54, 58), section=cls.s1 @@ -1027,6 +1033,53 @@ class AdminViewBasicTest(AdminViewBasicTestCase): self.assertContains(response, '<th scope="col" class="column-value">') self.assertNotContains(response, '<th scope="col" class="sortable column') + def test_change_view_subtitle_per_object(self): + response = self.client.get( + reverse('admin:admin_views_article_change', args=(self.a1.pk,)), + ) + self.assertContains( + response, + '<title>Article 1 | Change article | Django site admin</title>', + ) + self.assertContains(response, '<h1>Change article</h1>') + self.assertContains(response, '<h2>Article 1</h2>') + response = self.client.get( + reverse('admin:admin_views_article_change', args=(self.a2.pk,)), + ) + self.assertContains( + response, + '<title>Article 2 | Change article | Django site admin</title>', + ) + self.assertContains(response, '<h1>Change article</h1>') + self.assertContains(response, '<h2>Article 2</h2>') + + def test_view_subtitle_per_object(self): + viewuser = User.objects.create_user( + username='viewuser', password='secret', is_staff=True, + ) + viewuser.user_permissions.add( + get_perm(Article, get_permission_codename('view', Article._meta)), + ) + self.client.force_login(viewuser) + response = self.client.get( + reverse('admin:admin_views_article_change', args=(self.a1.pk,)), + ) + self.assertContains( + response, + '<title>Article 1 | View article | Django site admin</title>', + ) + self.assertContains(response, '<h1>View article</h1>') + self.assertContains(response, '<h2>Article 1</h2>') + response = self.client.get( + reverse('admin:admin_views_article_change', args=(self.a2.pk,)), + ) + self.assertContains( + response, + '<title>Article 2 | View article | Django site admin</title>', + ) + self.assertContains(response, '<h1>View article</h1>') + self.assertContains(response, '<h2>Article 2</h2>') + @override_settings(TEMPLATES=[{ 'BACKEND': 'django.template.backends.django.DjangoTemplates', |
