docs: def render(self, block, view_name, context=None):
          """
          Render a block by invoking its view.
  
          Finds the view named `view_name` on `block`.  The default view will be
          used if a specific view hasn't be registered.  If there is no default
          view, an exception will be raised.
  
          The view is invoked, passing it `context`.  The value returned by the
          view is returned, with possible modifications by the runtime to
          integrate it into a larger whole.
  
          """
          # Set the active view so that :function:`render_child` can use it
          # as a default
          old_view_name = self._view_name
          self._view_name = view_name
          try:
  
              view_fn = getattr(block, view_name, None)
              if view_fn is None:
                  view_fn = getattr(block, "fallback_view", None)
                  if view_fn is None:
                      raise NoSuchViewError(block, view_name)
                  view_fn = functools.partial(view_fn, view_name)
  
              frag = view_fn(context)
  
              # Explicitly save because render action may have changed state
              block.save()
              updated_frag = self.wrap_xblock(block, view_name, frag, context)
              return self.render_asides(block, view_name, updated_frag, context)
          finally:
              # Reset the active view to what it was before entering this method
              self._view_name = old_view_name