diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index 46277a433d..7dbfa17bfd 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -131,9 +131,79 @@ class ModelAdminView(object):
else:
return self.change_view(request, unquote(url))
- def add_view(self, request):
+ def add_view(self, request, show_delete=False, form_url='', post_url=None, post_url_continue='../%s/', object_id_override=None):
"The 'add' admin view for this model."
- raise NotImplementedError('Add view')
+ model = self.model
+ opts = model._meta
+ app_label = opts.app_label
+
+ if not request.user.has_perm(app_label + '.' + opts.get_add_permission()):
+ raise PermissionDenied
+
+ if post_url is None:
+ if request.user.has_perm(app_label + '.' + opts.get_change_permission()):
+ # redirect to list view
+ post_url = '../'
+ else:
+ # Object list will give 'Permission Denied', so go back to admin home
+ post_url = '../../../'
+
+ manipulator = model.AddManipulator()
+ if request.POST:
+ new_data = request.POST.copy()
+
+ if opts.has_field_type(models.FileField):
+ new_data.update(request.FILES)
+
+ errors = manipulator.get_validation_errors(new_data)
+ manipulator.do_html2python(new_data)
+
+ if not errors:
+ new_object = manipulator.save(new_data)
+ pk_value = new_object._get_pk_val()
+ LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), ADDITION)
+ msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': opts.verbose_name, 'obj': new_object}
+ # Here, we distinguish between different save types by checking for
+ # the presence of keys in request.POST.
+ if request.POST.has_key("_continue"):
+ request.user.message_set.create(message=msg + ' ' + _("You may edit it again below."))
+ if request.POST.has_key("_popup"):
+ post_url_continue += "?_popup=1"
+ return HttpResponseRedirect(post_url_continue % pk_value)
+ if request.POST.has_key("_popup"):
+ if type(pk_value) is str: # Quote if string, so JavaScript doesn't think it's a variable.
+ pk_value = '"%s"' % pk_value.replace('"', '\\"')
+ return HttpResponse('' % \
+ (pk_value, str(new_object).replace('"', '\\"')))
+ elif request.POST.has_key("_addanother"):
+ request.user.message_set.create(message=msg + ' ' + (_("You may add another %s below.") % opts.verbose_name))
+ return HttpResponseRedirect(request.path)
+ else:
+ request.user.message_set.create(message=msg)
+ return HttpResponseRedirect(post_url)
+ else:
+ # Add default data.
+ new_data = manipulator.flatten_data()
+
+ # Override the defaults with GET params, if they exist.
+ new_data.update(dict(request.GET.items()))
+
+ errors = {}
+
+ # Populate the FormWrapper.
+ form = oldforms.FormWrapper(manipulator, new_data, errors)
+
+ c = template.RequestContext(request, {
+ 'title': _('Add %s') % opts.verbose_name,
+ 'form': form,
+ 'is_popup': request.REQUEST.has_key('_popup'),
+ 'show_delete': show_delete,
+ })
+
+ if object_id_override is not None:
+ c['object_id'] = object_id_override
+
+ return render_change_form(model, manipulator, c, add=True)
def change_view(self, request, object_id):
"The 'change' admin view for this model."
@@ -145,7 +215,7 @@ class ModelAdminView(object):
raise PermissionDenied
if request.POST and request.POST.has_key("_saveasnew"):
- return add_stage(request, app_label, opts.object_name.lower(), form_url='../../add/')
+ return self.add_view(request, form_url='../../add/')
try:
manipulator = model.ChangeManipulator(object_id)
@@ -431,81 +501,6 @@ def index(request):
return render_to_response('admin/index.html', {'title': _('Site administration')}, context_instance=template.RequestContext(request))
index = staff_member_required(never_cache(index))
-def add_stage(request, app_label, model_name, show_delete=False, form_url='', post_url=None, post_url_continue='../%s/', object_id_override=None):
- model = models.get_model(app_label, model_name)
- if model is None:
- raise Http404("App %r, model %r, not found" % (app_label, model_name))
- opts = model._meta
-
- if not request.user.has_perm(app_label + '.' + opts.get_add_permission()):
- raise PermissionDenied
-
- if post_url is None:
- if request.user.has_perm(app_label + '.' + opts.get_change_permission()):
- # redirect to list view
- post_url = '../'
- else:
- # Object list will give 'Permission Denied', so go back to admin home
- post_url = '../../../'
-
- manipulator = model.AddManipulator()
- if request.POST:
- new_data = request.POST.copy()
-
- if opts.has_field_type(models.FileField):
- new_data.update(request.FILES)
-
- errors = manipulator.get_validation_errors(new_data)
- manipulator.do_html2python(new_data)
-
- if not errors:
- new_object = manipulator.save(new_data)
- pk_value = new_object._get_pk_val()
- LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), ADDITION)
- msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': opts.verbose_name, 'obj': new_object}
- # Here, we distinguish between different save types by checking for
- # the presence of keys in request.POST.
- if request.POST.has_key("_continue"):
- request.user.message_set.create(message=msg + ' ' + _("You may edit it again below."))
- if request.POST.has_key("_popup"):
- post_url_continue += "?_popup=1"
- return HttpResponseRedirect(post_url_continue % pk_value)
- if request.POST.has_key("_popup"):
- if type(pk_value) is str: # Quote if string, so JavaScript doesn't think it's a variable.
- pk_value = '"%s"' % pk_value.replace('"', '\\"')
- return HttpResponse('' % \
- (pk_value, str(new_object).replace('"', '\\"')))
- elif request.POST.has_key("_addanother"):
- request.user.message_set.create(message=msg + ' ' + (_("You may add another %s below.") % opts.verbose_name))
- return HttpResponseRedirect(request.path)
- else:
- request.user.message_set.create(message=msg)
- return HttpResponseRedirect(post_url)
- else:
- # Add default data.
- new_data = manipulator.flatten_data()
-
- # Override the defaults with GET params, if they exist.
- new_data.update(dict(request.GET.items()))
-
- errors = {}
-
- # Populate the FormWrapper.
- form = oldforms.FormWrapper(manipulator, new_data, errors)
-
- c = template.RequestContext(request, {
- 'title': _('Add %s') % opts.verbose_name,
- 'form': form,
- 'is_popup': request.REQUEST.has_key('_popup'),
- 'show_delete': show_delete,
- })
-
- if object_id_override is not None:
- c['object_id'] = object_id_override
-
- return render_change_form(model, manipulator, c, add=True)
-add_stage = staff_member_required(never_cache(add_stage))
-
def _nest_help(obj, depth, val):
current = obj
for i in range(depth):