diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 8f68eb13ec..a75f78356e 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -200,6 +200,7 @@ class ModelAdmin(BaseModelAdmin): inlines = [] # Custom templates (designed to be over-ridden in subclasses) + add_form_template = None change_form_template = None change_list_template = None delete_confirmation_template = None @@ -618,8 +619,12 @@ class ModelAdmin(BaseModelAdmin): 'save_on_top': self.save_on_top, 'root_path': self.admin_site.root_path, }) + if add and self.add_form_template is not None: + form_template = self.add_form_template + else: + form_template = self.change_form_template context_instance = template.RequestContext(request, current_app=self.admin_site.name) - return render_to_response(self.change_form_template or [ + return render_to_response(form_template or [ "admin/%s/%s/change_form.html" % (app_label, opts.object_name.lower()), "admin/%s/change_form.html" % app_label, "admin/change_form.html" diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt index a5b3138b44..fce694d6ac 100644 --- a/docs/ref/contrib/admin/index.txt +++ b/docs/ref/contrib/admin/index.txt @@ -712,11 +712,20 @@ view. Templates can override or extend base admin templates as described in If you don't specify this attribute, a default template shipped with Django that provides the standard appearance is used. +.. attribute:: ModelAdmin.add_form_template + +Path to a custom template that will be used by the model object creation +views. Templates can override or extend base admin templates as described in +`Overriding Admin Templates`_. + +If you don't specify this attribute, a default template shipped with Django +that provides the standard appearance is used. + .. attribute:: ModelAdmin.change_form_template -Path to a custom template that will be used by both the model object creation -and change views. Templates can override or extend base admin templates as -described in `Overriding Admin Templates`_. +Path to a custom template that will be used by the model object change views. +Templates can override or extend base admin templates as described in +`Overriding Admin Templates`_. If you don't specify this attribute, a default template shipped with Django that provides the standard appearance is used. diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py index ffdc72620e..384a6d92a6 100644 --- a/tests/regressiontests/admin_views/models.py +++ b/tests/regressiontests/admin_views/models.py @@ -110,6 +110,7 @@ class CustomArticleAdmin(admin.ModelAdmin): """ change_list_template = 'custom_admin/change_list.html' change_form_template = 'custom_admin/change_form.html' + add_form_template = 'custom_admin/add_form.html' object_history_template = 'custom_admin/object_history.html' delete_confirmation_template = 'custom_admin/delete_confirmation.html' diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index c580491486..4d6e1d5139 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -550,11 +550,11 @@ class AdminViewPermissionsTest(TestCase): self.assert_("var hello = 'Hello!';" in request.content) self.assertTemplateUsed(request, 'custom_admin/change_list.html') - # Test custom change form template + # Test custom add form template request = self.client.get('/test_admin/admin/admin_views/customarticle/add/') - self.assertTemplateUsed(request, 'custom_admin/change_form.html') + self.assertTemplateUsed(request, 'custom_admin/add_form.html') - # Add an article so we can test delete and history views + # Add an article so we can test delete, change, and history views post = self.client.post('/test_admin/admin/admin_views/customarticle/add/', { 'content': '
great article
', 'date_0': '2008-03-18', @@ -563,7 +563,10 @@ class AdminViewPermissionsTest(TestCase): self.assertRedirects(post, '/test_admin/admin/admin_views/customarticle/') self.failUnlessEqual(CustomArticle.objects.all().count(), 1) - # Test custom delete and object history templates + # Test custom delete, change, and object history templates + # Test custom change form template + request = self.client.get('/test_admin/admin/admin_views/customarticle/1/') + self.assertTemplateUsed(request, 'custom_admin/change_form.html') request = self.client.get('/test_admin/admin/admin_views/customarticle/1/delete/') self.assertTemplateUsed(request, 'custom_admin/delete_confirmation.html') request = self.client.get('/test_admin/admin/admin_views/customarticle/1/history/') diff --git a/tests/templates/custom_admin/add_form.html b/tests/templates/custom_admin/add_form.html new file mode 100644 index 0000000000..f42ba4b649 --- /dev/null +++ b/tests/templates/custom_admin/add_form.html @@ -0,0 +1 @@ +{% extends "admin/change_form.html" %}