1
0
mirror of https://github.com/django/django.git synced 2025-07-04 17:59:13 +00:00

newforms-admin: Added ability to pass extra_context argument to ModelAdmin's add_view, change_view, changelist_view, delete_view and history_view methods. This makes it easier to customise those pages; you can over-ride the methods in your subclass and call the super method with extra_context to feed additional variables to your custom admin templates.

git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@7627 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Simon Willison 2008-06-12 20:58:56 +00:00
parent f914b0a71b
commit a33bd6b594
5 changed files with 70 additions and 32 deletions

View File

@ -455,7 +455,7 @@ class ModelAdmin(BaseModelAdmin):
opts = model._meta opts = model._meta
app_label = opts.app_label app_label = opts.app_label
ordered_objects = opts.get_ordered_objects() ordered_objects = opts.get_ordered_objects()
extra_context = { context.update({
'add': add, 'add': add,
'change': change, 'change': change,
'has_add_permission': self.has_add_permission(request), 'has_add_permission': self.has_add_permission(request),
@ -469,14 +469,14 @@ class ModelAdmin(BaseModelAdmin):
'content_type_id': ContentType.objects.get_for_model(model).id, 'content_type_id': ContentType.objects.get_for_model(model).id,
'save_as': self.save_as, 'save_as': self.save_as,
'save_on_top': self.save_on_top, 'save_on_top': self.save_on_top,
} })
context.update(extra_context)
return render_to_response([ return render_to_response([
"admin/%s/%s/change_form.html" % (app_label, opts.object_name.lower()), "admin/%s/%s/change_form.html" % (app_label, opts.object_name.lower()),
"admin/%s/change_form.html" % app_label, "admin/%s/change_form.html" % app_label,
"admin/change_form.html"], context_instance=context) "admin/change_form.html"
], context, context_instance=template.RequestContext(request))
def add_view(self, request, form_url=''): def add_view(self, request, form_url='', extra_context=None):
"The 'add' admin view for this model." "The 'add' admin view for this model."
model = self.model model = self.model
opts = model._meta opts = model._meta
@ -520,17 +520,18 @@ class ModelAdmin(BaseModelAdmin):
inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets) inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets)
inline_admin_formsets.append(inline_admin_formset) inline_admin_formsets.append(inline_admin_formset)
c = template.RequestContext(request, { context = {
'title': _('Add %s') % opts.verbose_name, 'title': _('Add %s') % opts.verbose_name,
'adminform': adminForm, 'adminform': adminForm,
'is_popup': request.REQUEST.has_key('_popup'), 'is_popup': request.REQUEST.has_key('_popup'),
'show_delete': False, 'show_delete': False,
'media': mark_safe(media), 'media': mark_safe(media),
'inline_admin_formsets': inline_admin_formsets, 'inline_admin_formsets': inline_admin_formsets,
}) }
return self.render_change_form(request, model, c, add=True) context.update(extra_context or {})
return self.render_change_form(request, model, context, add=True)
def change_view(self, request, object_id): def change_view(self, request, object_id, extra_context=None):
"The 'change' admin view for this model." "The 'change' admin view for this model."
model = self.model model = self.model
opts = model._meta opts = model._meta
@ -594,7 +595,7 @@ class ModelAdmin(BaseModelAdmin):
inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets) inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets)
inline_admin_formsets.append(inline_admin_formset) inline_admin_formsets.append(inline_admin_formset)
c = template.RequestContext(request, { context = {
'title': _('Change %s') % opts.verbose_name, 'title': _('Change %s') % opts.verbose_name,
'adminform': adminForm, 'adminform': adminForm,
'object_id': object_id, 'object_id': object_id,
@ -602,10 +603,11 @@ class ModelAdmin(BaseModelAdmin):
'is_popup': request.REQUEST.has_key('_popup'), 'is_popup': request.REQUEST.has_key('_popup'),
'media': mark_safe(media), 'media': mark_safe(media),
'inline_admin_formsets': inline_admin_formsets, 'inline_admin_formsets': inline_admin_formsets,
}) }
return self.render_change_form(request, model, c, change=True, obj=obj) context.update(extra_context or {})
return self.render_change_form(request, model, context, change=True, obj=obj)
def changelist_view(self, request): def changelist_view(self, request, extra_context=None):
"The 'change list' admin view for this model." "The 'change list' admin view for this model."
from django.contrib.admin.views.main import ChangeList, ERROR_FLAG from django.contrib.admin.views.main import ChangeList, ERROR_FLAG
opts = self.model._meta opts = self.model._meta
@ -624,17 +626,20 @@ class ModelAdmin(BaseModelAdmin):
if ERROR_FLAG in request.GET.keys(): if ERROR_FLAG in request.GET.keys():
return render_to_response('admin/invalid_setup.html', {'title': _('Database error')}) return render_to_response('admin/invalid_setup.html', {'title': _('Database error')})
return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1') return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1')
c = template.RequestContext(request, { context = {
'title': cl.title, 'title': cl.title,
'is_popup': cl.is_popup, 'is_popup': cl.is_popup,
'cl': cl, 'cl': cl,
}) }
c.update({'has_add_permission': self.has_add_permission(request)}), context.update({'has_add_permission': self.has_add_permission(request)}),
return render_to_response(['admin/%s/%s/change_list.html' % (app_label, opts.object_name.lower()), context.update(extra_context or {})
'admin/%s/change_list.html' % app_label, return render_to_response([
'admin/change_list.html'], context_instance=c) 'admin/%s/%s/change_list.html' % (app_label, opts.object_name.lower()),
'admin/%s/change_list.html' % app_label,
'admin/change_list.html'
], context, context_instance=template.RequestContext(request))
def delete_view(self, request, object_id): def delete_view(self, request, object_id, extra_context=None):
"The 'delete' admin view for this model." "The 'delete' admin view for this model."
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.admin.models import LogEntry, DELETION from django.contrib.admin.models import LogEntry, DELETION
@ -671,7 +676,7 @@ class ModelAdmin(BaseModelAdmin):
if not self.has_change_permission(request, None): if not self.has_change_permission(request, None):
return HttpResponseRedirect("../../../../") return HttpResponseRedirect("../../../../")
return HttpResponseRedirect("../../") return HttpResponseRedirect("../../")
extra_context = { context = {
"title": _("Are you sure?"), "title": _("Are you sure?"),
"object_name": opts.verbose_name, "object_name": opts.verbose_name,
"object": obj, "object": obj,
@ -679,11 +684,14 @@ class ModelAdmin(BaseModelAdmin):
"perms_lacking": perms_needed, "perms_lacking": perms_needed,
"opts": opts, "opts": opts,
} }
return render_to_response(["admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower() ), context.update(extra_context or {})
"admin/%s/delete_confirmation.html" % app_label , return render_to_response([
"admin/delete_confirmation.html"], extra_context, context_instance=template.RequestContext(request)) "admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower()),
"admin/%s/delete_confirmation.html" % app_label,
"admin/delete_confirmation.html"
], context, context_instance=template.RequestContext(request))
def history_view(self, request, object_id): def history_view(self, request, object_id, extra_context=None):
"The 'history' admin view for this model." "The 'history' admin view for this model."
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.admin.models import LogEntry from django.contrib.admin.models import LogEntry
@ -693,18 +701,18 @@ class ModelAdmin(BaseModelAdmin):
content_type__id__exact=ContentType.objects.get_for_model(model).id).select_related().order_by('action_time') content_type__id__exact=ContentType.objects.get_for_model(model).id).select_related().order_by('action_time')
# If no history was found, see whether this object even exists. # If no history was found, see whether this object even exists.
obj = get_object_or_404(model, pk=object_id) obj = get_object_or_404(model, pk=object_id)
extra_context = { context = {
'title': _('Change history: %s') % force_unicode(obj), 'title': _('Change history: %s') % force_unicode(obj),
'action_list': action_list, 'action_list': action_list,
'module_name': capfirst(opts.verbose_name_plural), 'module_name': capfirst(opts.verbose_name_plural),
'object': obj, 'object': obj,
} }
template_list = [ context.update(extra_context or {})
return render_to_response([
"admin/%s/%s/object_history.html" % (opts.app_label, opts.object_name.lower()), "admin/%s/%s/object_history.html" % (opts.app_label, opts.object_name.lower()),
"admin/%s/object_history.html" % opts.app_label, "admin/%s/object_history.html" % opts.app_label,
"admin/object_history.html" "admin/object_history.html"
] ], context, context_instance=template.RequestContext(request))
return render_to_response(template_list, extra_context, context_instance=template.RequestContext(request))
class InlineModelAdmin(BaseModelAdmin): class InlineModelAdmin(BaseModelAdmin):
""" """

View File

@ -9,9 +9,25 @@ class Article(models.Model):
content = models.TextField() content = models.TextField()
date = models.DateTimeField() date = models.DateTimeField()
class ArticleAdmin(admin.ModelAdmin): class ArticleAdmin(admin.ModelAdmin):
list_display = ('content', 'date') list_display = ('content', 'date')
list_filter = ('date',) list_filter = ('date',)
def changelist_view(self, request):
"Test that extra_context works"
return super(ArticleAdmin, self).changelist_view(request, extra_context={
'extra_var': 'Hello!'
})
class CustomArticle(Article):
pass
class CustomArticleAdmin(admin.ModelAdmin):
def changelist_view(self, request):
"Test that extra_context works"
return super(CustomArticleAdmin, self).changelist_view(request, extra_context={
'extra_var': 'Hello!'
})
admin.site.register(Article, ArticleAdmin) admin.site.register(Article, ArticleAdmin)
admin.site.register(CustomArticle, CustomArticleAdmin)

View File

@ -183,6 +183,13 @@ class AdminViewPermissionsTest(TestCase):
self.failUnlessEqual(Article.objects.get(pk=1).content, '<p>edited article</p>') self.failUnlessEqual(Article.objects.get(pk=1).content, '<p>edited article</p>')
self.client.get('/test_admin/admin/logout/') self.client.get('/test_admin/admin/logout/')
def testCustomChangelistView(self):
self.client.get('/test_admin/admin/')
self.client.post('/test_admin/admin/', self.super_login)
request = self.client.get('/test_admin/admin/admin_views/customarticle/')
self.failUnlessEqual(request.status_code, 200)
self.assert_("var hello = 'Hello!';" in request.content)
def testDeleteView(self): def testDeleteView(self):
"""Delete view should restrict access and actually delete items.""" """Delete view should restrict access and actually delete items."""

View File

@ -0,0 +1,7 @@
{% extends "admin/change_list.html" %}
{% block extrahead %}
<script type="text/javascript">
var hello = '{{ extra_var }}';
</script>
{% endblock %}