diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py index fb9840c8ca..94872fc53d 100644 --- a/django/contrib/admin/sites.py +++ b/django/contrib/admin/sites.py @@ -41,6 +41,9 @@ class AdminSite(object): # Text to put at the top of the admin index page. index_title = ugettext_lazy('Site administration') + # URL for the "View site" link at the top of each admin page. + site_url = '/' + login_form = None index_template = None app_index_template = None @@ -272,6 +275,7 @@ class AdminSite(object): return { 'site_title': self.site_title, 'site_header': self.site_header, + 'site_url': self.site_url, } def password_change(self, request): diff --git a/django/contrib/admin/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html index d52554f633..fca6b349d2 100644 --- a/django/contrib/admin/templates/admin/base.html +++ b/django/contrib/admin/templates/admin/base.html @@ -31,6 +31,9 @@ {% firstof user.get_short_name user.get_username %}. {% endblock %} {% block userlinks %} + {% if site_url %} + {% trans 'View site' %} / + {% endif %} {% url 'django-admindocs-docroot' as docsroot %} {% if docsroot %} {% trans 'Documentation' %} / diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt index 01d73407f3..ca55df3ce7 100644 --- a/docs/ref/contrib/admin/index.txt +++ b/docs/ref/contrib/admin/index.txt @@ -2445,6 +2445,13 @@ Templates can override or extend base admin templates as described in The text to put at the end of each admin page's ```` (a string). By default, this is "Django site admin". +.. attribute:: AdminSite.site_url + + .. versionadded:: 1.8 + + The URL for the "View site" link at the top of each admin page. By default, + ``site_url`` is ``/``. Set it to ``None`` to remove the link. + .. attribute:: AdminSite.index_title .. versionadded:: 1.7 diff --git a/docs/releases/1.8.txt b/docs/releases/1.8.txt index 7cf14f1bef..ea5101ff72 100644 --- a/docs/releases/1.8.txt +++ b/docs/releases/1.8.txt @@ -50,6 +50,10 @@ Minor features * The jQuery library embedded in the admin has been upgraded to version 1.11.1. +* You can now specify :attr:`AdminSite.site_url + <django.contrib.admin.AdminSite.site_url>` in order to display a link to the + front-end site. + :mod:`django.contrib.auth` ^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/tests/admin_views/admin.py b/tests/admin_views/admin.py index e00cc69f52..c98e2c8c83 100644 --- a/tests/admin_views/admin.py +++ b/tests/admin_views/admin.py @@ -832,6 +832,7 @@ class FunkyTagAdmin(admin.ModelAdmin): site = admin.AdminSite(name="admin") +site.site_url = '/my-site-url/' site.register(Article, ArticleAdmin) site.register(CustomArticle, CustomArticleAdmin) site.register(Section, save_as=True, inlines=[ArticleInline]) diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index 60ad3d2b7b..55c3532985 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -744,6 +744,15 @@ class AdminViewBasicTest(AdminViewBasicTestCase): color2_delete_log = LogEntry.objects.all()[0] self.assertEqual(color2_content_type, color2_delete_log.content_type) + def test_adminsite_display_site_url(self): + """ + #13749 - Admin should display link to front-end site 'View site' + """ + url = reverse('admin:index') + response = self.client.get(url) + self.assertEqual(response.context['site_url'], '/my-site-url/') + self.assertContains(response, '<a href="/my-site-url/">View site</a>') + @override_settings(TEMPLATE_DIRS=ADMIN_VIEW_TEMPLATES_DIR) class AdminCustomTemplateTests(AdminViewBasicTestCase):