docs: def render_change_form(self, request, context, add=False, change=False,
                             form_url='', obj=None):
          """
          Provides the context and rendering for the admin change form.
  
          :param request: Django request object.
          :param context: The context dictionary to be passed to the template.
          :param add: Should the add form be rendered? Boolean input.
          :param change: Should the change for be rendered? Boolean input.
          :param form_url: The URL to use for the form submit action.
          :param obj: An object the render change form is for.
          """
          obj = context.get('original', None)
          if obj:
              context['object'] = obj
              context['has_been_published'] = obj.has_been_published
              context['is_dirty'] = obj.is_dirty
              context['has_preview_permission'] = \
                  self.has_preview_permission(request, obj)
  
              if not self.has_publish_permission(request, obj):
                  context['has_publish_permission'] = False
              else:
                  context['has_publish_permission'] = True
  
                  try:
                      object_url = obj.get_absolute_url()
                  except (NoReverseMatch, AttributeError):
                      object_url = ''
  
                  # If the user has publishing permission and if there are
                  # changes which are to be published show the publish button
                  # with relevant URL.
                  publish_btn = None
                  if obj.is_dirty:
                      publish_btn = reverse(
                          self.publish_reverse(type(obj)), args=(obj.pk, ))
  
                  # If the user has publishing permission, a draft object and
                  # a published object show the unpublish button with relevant
                  # URL.
                  unpublish_btn = None
                  if obj.is_draft and obj.publishing_linked:
                      unpublish_btn = reverse(
                          self.unpublish_reverse(type(obj)), args=(obj.pk, ))
  
                  # If the user has publishing permission, the object has draft
                  # changes and a published version show a revert button to
                  # change back to the published information.
                  revert_btn = None
                  if obj.is_dirty and obj.publishing_linked:
                      revert_btn = reverse(self.revert_reverse, args=(obj.pk, ))
  
                  context.update({
                      'object_url': object_url,
                      'publish_btn': publish_btn,
                      'unpublish_btn': unpublish_btn,
                      'revert_btn': revert_btn,
                  })
  
          # Make the original non-publishing template available to the publishing
          # change form template, so it knows what base it extends.
          # The `original_change_form_template` context variable does the same
          # job for reversion's versioning change form template.
          context.update({
              'non_publishing_change_form_template':
                  self.non_publishing_change_form_template,
              'original_change_form_template':
                  self.non_publishing_change_form_template,
          })
  
          # Hook to permit subclasses to modify context in change form
          try:
              self.update_context_for_render_change_form(context, obj)
          except AttributeError:
              pass
  
          # Override this admin's change form template to point to the publishing
          # admin page template, but only for long enough to render the change
          # form.
          if hasattr(type(self).change_form_template, '__get__') \
                  and isinstance(self.change_form_template, (list, tuple)):
              # Special handling for class that provide multiple templates via,
              # a `change_form_template` get-only property instead of the usual
              # plain class attribute.  In this case, find the best available
              # template preferring publishing-specific templates and apply it
              # via a context variable that should be respected by Fluent's base
              # templates, which we are most likely using at this point.
              opts = self.model._meta
              app_label = opts.app_label
              extra_change_form_templates = [
                  "admin/%s/%s/publishing_change_form.html" % (
                      app_label, opts.model_name),
                  "admin/%s/publishing_change_form.html" % app_label,
                  "admin/publishing/publishing_change_form.html"
              ]
              context['default_change_form_template'] = \
                  self.find_first_available_template(
                      extra_change_form_templates + self.change_form_template)
  
              # Directly overriding the `change_form_template` attr here is
              # particularly messy since it can be a property getter, not
              # a normal attr, and any normal way of overriding or updating the
              # value will not work.
              try:
                  self._change_form_template_getter = \
                      type(self).change_form_template.__get__
                  type(self).change_form_template = \
                      context['default_change_form_template']
                  has_change_form_attr_getter = True
              except AttributeError:
                  # AttributeError presumably from `.__get__` hack above, in
                  # which case we don't need to worry about getters and can just
                  # do things the usual way
                  self.change_form_template = \
                      context['default_change_form_template']
                  has_change_form_attr_getter = False
          else:
              self.change_form_template = \
                  "admin/publishing/publishing_change_form.html"
              has_change_form_attr_getter = False
  
          response = super(PublishingAdmin, self).render_change_form(
              request, context,
              add=add, change=change, form_url=form_url, obj=obj)
  
          # Reset change form template
          if has_change_form_attr_getter:
              type(self).change_form_template = \
                  self._change_form_template_getter
          else:
              self.change_form_template = \
                  self.non_publishing_change_form_template
  
          return response