summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Dufresne <jon.dufresne@gmail.com>2020-09-08 15:39:43 -0700
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-09-11 06:28:45 +0200
commit84609b3205905097d7d3038d32e6101f012c0619 (patch)
treec5b733bf54a3765a62deaf92e96744c5409f5750
parentcbe34dc8ecbd42de6db5caa9fa66b04fa4841636 (diff)
Fixed #31993 -- Added subtitles to admin change/view pages.
-rw-r--r--django/contrib/admin/options.py2
-rw-r--r--django/contrib/admin/templates/admin/base.html1
-rw-r--r--django/contrib/admin/templates/admin/base_site.html2
-rw-r--r--tests/admin_views/tests.py57
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',