From e8cd4084b7903cf6b5d96dbf292ec15ac40b2e58 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sun, 15 Jun 2008 18:21:11 +0000 Subject: [PATCH] AdminSite.root() now figures out the base URL of the admin site and stashes it as self.root_path. This is made available to admin templates, avoiding the need to use relative URLs for links to higher level admin pages. One consequence of this change is that you can now reliably over-ride the userlinks block in a custom base_site.html template. git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@7638 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/admin/options.py | 8 +++++++- django/contrib/admin/sites.py | 11 ++++++++--- .../templates/admin/auth/user/change_password.html | 1 - django/contrib/admin/templates/admin/base.html | 2 +- django/contrib/admin/templates/admin/change_form.html | 2 -- django/contrib/admin/templates/admin/change_list.html | 2 -- .../admin/templates/admin/delete_confirmation.html | 2 -- .../contrib/admin/templates/admin/object_history.html | 2 -- 8 files changed, 16 insertions(+), 14 deletions(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index b52a82e61a..acc7d3962a 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -479,6 +479,7 @@ class ModelAdmin(BaseModelAdmin): 'content_type_id': ContentType.objects.get_for_model(model).id, 'save_as': self.save_as, 'save_on_top': self.save_on_top, + 'root_path': self.admin_site.root_path, }) return render_to_response(self.change_form_template or [ "admin/%s/%s/change_form.html" % (app_label, opts.object_name.lower()), @@ -537,6 +538,7 @@ class ModelAdmin(BaseModelAdmin): 'show_delete': False, 'media': mark_safe(media), 'inline_admin_formsets': inline_admin_formsets, + 'root_path': self.admin_site.root_path, } context.update(extra_context or {}) return self.render_change_form(request, model, context, add=True) @@ -613,6 +615,7 @@ class ModelAdmin(BaseModelAdmin): 'is_popup': request.REQUEST.has_key('_popup'), 'media': mark_safe(media), 'inline_admin_formsets': inline_admin_formsets, + 'root_path': self.admin_site.root_path, } context.update(extra_context or {}) return self.render_change_form(request, model, context, change=True, obj=obj) @@ -641,8 +644,9 @@ class ModelAdmin(BaseModelAdmin): 'title': cl.title, 'is_popup': cl.is_popup, 'cl': cl, + 'has_add_permission': self.has_add_permission(request), + 'root_path': self.admin_site.root_path, } - context.update({'has_add_permission': self.has_add_permission(request)}), context.update(extra_context or {}) return render_to_response(self.change_list_template or [ 'admin/%s/%s/change_list.html' % (app_label, opts.object_name.lower()), @@ -695,6 +699,7 @@ class ModelAdmin(BaseModelAdmin): "deleted_objects": deleted_objects, "perms_lacking": perms_needed, "opts": opts, + "root_path": self.admin_site.root_path, } context.update(extra_context or {}) return render_to_response(self.delete_confirmation_template or [ @@ -720,6 +725,7 @@ class ModelAdmin(BaseModelAdmin): 'action_list': action_list, 'module_name': capfirst(opts.verbose_name_plural), 'object': obj, + 'root_path': self.admin_site.root_path, } context.update(extra_context or {}) return render_to_response(self.object_history_template or [ diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py index ce14b269fb..b7bea355c7 100644 --- a/django/contrib/admin/sites.py +++ b/django/contrib/admin/sites.py @@ -94,11 +94,14 @@ class AdminSite(object): return request.user.is_authenticated() and request.user.is_staff def root(self, request, url): - """ + """ Handles main URL routing for the admin app. `url` is the remainder of the URL -- e.g. 'comments/comment/'. - """ + """ + # Figure out the admin base URL path and stash it for later use + self.root_path = re.sub(re.escape(url) + '$', '', request.path) + url = url.rstrip('/') # Trim trailing slash, if it exists. # The 'logout' view doesn't require that the person is logged in. @@ -295,6 +298,7 @@ class AdminSite(object): context = { 'title': _('Site administration'), 'app_list': app_list, + 'root_path': self.root_path, } context.update(extra_context or {}) return render_to_response(self.index_template or 'admin/index.html', context, @@ -316,7 +320,8 @@ class AdminSite(object): 'title': _('Log in'), 'app_path': request.path, 'post_data': post_data, - 'error_message': error_message + 'error_message': error_message, + 'root_path': self.root_path, } context.update(extra_context or {}) return render_to_response(self.login_template or 'admin/login.html', context, diff --git a/django/contrib/admin/templates/admin/auth/user/change_password.html b/django/contrib/admin/templates/admin/auth/user/change_password.html index 5740feb60f..f1c4a8d34a 100644 --- a/django/contrib/admin/templates/admin/auth/user/change_password.html +++ b/django/contrib/admin/templates/admin/auth/user/change_password.html @@ -5,7 +5,6 @@ {% endblock %} {% block stylesheet %}{% admin_media_prefix %}css/forms.css{% endblock %} {% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} -{% block userlinks %}{% trans 'Documentation' %} / {% trans 'Change password' %} / {% trans 'Log out' %}{% endblock %} {% block breadcrumbs %}{% if not is_popup %} {% if user.is_authenticated and user.is_staff %} -
{% trans 'Welcome,' %} {% if user.first_name %}{{ user.first_name|escape }}{% else %}{{ user.username }}{% endif %}. {% block userlinks %}{% trans 'Documentation' %} / {% trans 'Change password' %} / {% trans 'Log out' %}{% endblock %}
+
{% trans 'Welcome,' %} {% if user.first_name %}{{ user.first_name|escape }}{% else %}{{ user.username }}{% endif %}. {% block userlinks %}{% trans 'Documentation' %} / {% trans 'Change password' %} / {% trans 'Log out' %}{% endblock %}
{% endif %} {% block nav-global %}{% endblock %} diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html index dd6d3ca0e6..769b5c3240 100644 --- a/django/contrib/admin/templates/admin/change_form.html +++ b/django/contrib/admin/templates/admin/change_form.html @@ -12,8 +12,6 @@ {% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} -{% block userlinks %}{% trans 'Documentation' %} / {% trans 'Change password' %} / {% trans 'Log out' %}{% endblock %} - {% block breadcrumbs %}{% if not is_popup %}