docs: def change_view(self, request, object_id, form_url='', extra_context=None):
          "The 'change' admin view for this model."
          model = self.model
          opts = model._meta
  
          obj = self.get_object(request, unquote(object_id))
  
          if not self.has_change_permission(request, obj):
              raise PermissionDenied
  
          if obj is None:
              raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_text(opts.verbose_name), 'key': escape(object_id)})
  
          if request.method == 'POST' and "_saveasnew" in request.POST:
              return self.add_view(request, form_url=reverse('admin:%s_%s_add' %
                                                             (opts.app_label, opts.module_name),
                  current_app=self.admin_site.name))
  
          ModelForm = self.get_form(request, obj)
          formsets = []
          inline_instances = self.get_inline_instances(request, obj)
          if request.method == 'POST':
              form = ModelForm(request.POST, request.FILES, instance=obj)
              if form.is_valid():
                  form_validated = True
                  new_object = self.save_form(request, form, change=True)
              else:
                  form_validated = False
                  new_object = obj
              prefixes = {}
              for FormSet, inline in self.get_formsets_with_inlines(request, new_object):
                  prefix = FormSet.get_default_prefix()
                  prefixes[prefix] = prefixes.get(prefix, 0) + 1
                  if prefixes[prefix] != 1 or not prefix:
                      prefix = "%s-%s" % (prefix, prefixes[prefix])
                  formset = FormSet(request.POST, request.FILES,
                      instance=new_object, prefix=prefix,
                      queryset=inline.get_queryset(request))
                  formsets.append(formset)
                  if hasattr(inline, 'inlines') and inline.inlines:
                      self.add_nested_inline_formsets(request, inline, formset)
  
              if self.all_valid_with_nesting(formsets) and form_validated:
                  self.save_model(request, new_object, form, True)
                  self.save_related(request, form, formsets, True)
                  change_message = self.construct_change_message(request, form, formsets)
                  self.log_change(request, new_object, change_message)
                  return self.response_change(request, new_object)
  
          else:
              form = ModelForm(instance=obj)
              prefixes = {}
              for FormSet, inline in self.get_formsets_with_inlines(request, obj):
                  prefix = FormSet.get_default_prefix()
                  prefixes[prefix] = prefixes.get(prefix, 0) + 1
                  if prefixes[prefix] != 1 or not prefix:
                      prefix = "%s-%s" % (prefix, prefixes[prefix])
                  formset = FormSet(instance=obj, prefix=prefix,
                      queryset=inline.get_queryset(request))
                  formsets.append(formset)
                  if hasattr(inline, 'inlines') and inline.inlines:
                      self.add_nested_inline_formsets(request, inline, formset)
  
          adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj),
              self.get_prepopulated_fields(request, obj),
              self.get_readonly_fields(request, obj),
              model_admin=self)
          media = self.media + adminForm.media
  
          inline_admin_formsets = []
          for inline, formset in zip(inline_instances, formsets):
              fieldsets = list(inline.get_fieldsets(request, obj))
              readonly = list(inline.get_readonly_fields(request, obj))
              prepopulated = dict(inline.get_prepopulated_fields(request, obj))
              inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
                  fieldsets, prepopulated, readonly, model_admin=self)
              inline_admin_formsets.append(inline_admin_formset)
              media = media + inline_admin_formset.media
              if hasattr(inline, 'inlines') and inline.inlines:
                  media += self.wrap_nested_inline_formsets(request, inline, formset)
  
          context = {
              'title': _('Change %s') % force_text(opts.verbose_name),
              'adminform': adminForm,
              'object_id': object_id,
              'original': obj,
              'is_popup': "_popup" in request.GET,
              'media': media,
              'inline_admin_formsets': inline_admin_formsets,
              'errors': helpers.AdminErrorList(form, formsets),
              'app_label': opts.app_label,
              }
          context.update(self.admin_site.each_context(request))
          context.update(extra_context or {})
          return self.render_change_form(request, context, change=True, obj=obj, form_url=form_url)