def add_view(self, request, form_url='', extra_context=None): "The 'add' admin view for this model." model = self.model opts = model._meta app_label = opts.app_label if not self.has_add_permission(request): raise PermissionDenied if self.has_change_permission(request, None): # redirect to list view post_url = '../' else: # Object list will give 'Permission Denied', so go back to admin home post_url = '../../../' ModelForm = self.get_form(request) inline_formsets = [] obj = self.model() if request.method == 'POST': form = ModelForm(request.POST, request.FILES) for FormSet in self.get_formsets(request): inline_formset = FormSet(data=request.POST, files=request.FILES, instance=obj, save_as_new=request.POST.has_key("_saveasnew")) inline_formsets.append(inline_formset) if all_valid(inline_formsets) and form.is_valid(): return self.save_add(request, model, form, inline_formsets, '../%s/') else: form = ModelForm(initial=dict(request.GET.items())) for FormSet in self.get_formsets(request): inline_formset = FormSet(instance=obj) inline_formsets.append(inline_formset) adminForm = AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields) media = self.media + adminForm.media for fs in inline_formsets: media = media + fs.media inline_admin_formsets = [] for inline, formset in zip(self.inline_instances, inline_formsets): fieldsets = list(inline.get_fieldsets(request)) inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets) inline_admin_formsets.append(inline_admin_formset) context = { 'title': _('Add %s') % opts.verbose_name, 'adminform': adminForm, 'is_popup': request.REQUEST.has_key('_popup'), '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)
def change_view(self, request, object_id): "The 'change' admin view for this model." model = self.model opts = model._meta app_label = opts.app_label try: obj = model._default_manager.get(pk=object_id) except model.DoesNotExist: # Don't raise Http404 just yet, because we haven't checked # permissions yet. We don't want an unauthenticated user to be able # to determine whether a given object exists. obj = None if not self.has_change_permission(request, obj): raise PermissionDenied if obj is None: raise Http404('%s object with primary key %r does not exist.' % (opts.verbose_name, escape(object_id))) if request.POST and request.POST.has_key("_saveasnew"): return self.add_view(request, form_url='../../add/') ModelForm = self.get_form(request, obj) inline_formsets = [] if request.method == 'POST': form = ModelForm(request.POST, request.FILES, instance=obj) for FormSet in self.get_formsets(request, obj): inline_formset = FormSet(request.POST, request.FILES, instance=obj) inline_formsets.append(inline_formset) if all_valid(inline_formsets) and form.is_valid(): return self.save_change(request, model, form, inline_formsets) else: form = ModelForm(instance=obj) for FormSet in self.get_formsets(request, obj): inline_formset = FormSet(instance=obj) inline_formsets.append(inline_formset) ## Populate the FormWrapper. #oldform = oldforms.FormWrapper(manipulator, new_data, errors) #oldform.original = manipulator.original_object #oldform.order_objects = [] ## TODO: Should be done in flatten_data / FormWrapper construction #for related in opts.get_followed_related_objects(): #wrt = related.opts.order_with_respect_to #if wrt and wrt.rel and wrt.rel.to == opts: #func = getattr(manipulator.original_object, 'get_%s_list' % #related.get_accessor_name()) #orig_list = func() #oldform.order_objects.extend(orig_list) adminForm = AdminForm(form, self.get_fieldsets(request, obj), self.prepopulated_fields) media = self.media + adminForm.media for fs in inline_formsets: media = media + fs.media inline_admin_formsets = [] for inline, formset in zip(self.inline_instances, inline_formsets): fieldsets = list(inline.get_fieldsets(request, obj)) inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets) inline_admin_formsets.append(inline_admin_formset) c = template.RequestContext(request, { 'title': _('Change %s') % opts.verbose_name, 'adminform': adminForm, 'object_id': object_id, 'original': obj, 'is_popup': request.REQUEST.has_key('_popup'), 'media': mark_safe(media), 'inline_admin_formsets': inline_admin_formsets, }) return self.render_change_form(request, model, c, change=True, obj=obj)