docs: def _render_template_block_nodelist(nodelist, block_name, context):
      """Recursively iterate over a node to find the wanted block."""
  
      # Attempt to find the wanted block in the current template.
      for node in nodelist:
          # If the wanted block was found, return it.
          if isinstance(node, BlockNode):
              # No matter what, add this block to the rendering context.
              context.render_context[BLOCK_CONTEXT_KEY].push(node.name, node)
  
              # If the name matches, you're all set and we found the block!
              if node.name == block_name:
                  return node.render(context)
  
          # If a node has children, recurse into them. Based on
          # django.template.base.Node.get_nodes_by_type.
          for attr in node.child_nodelists:
              try:
                  new_nodelist = getattr(node, attr)
              except AttributeError:
                  continue
  
              # Try to find the block recursively.
              try:
                  return _render_template_block_nodelist(new_nodelist, block_name, context)
              except BlockNotFound:
                  continue
  
      # The wanted block_name was not found.
      raise BlockNotFound("block with name '%s' does not exist" % block_name)