old_contents: from django import template
  from django.template import Library
  from django.utils import six
  from django.utils.safestring import mark_safe
  
  from xadmin.util import static, vendor as util_vendor
  
  register = Library()
  
  
  @register.simple_tag(takes_context=True)
  def view_block(context, block_name, *args, **kwargs):
      if 'admin_view' not in context:
          return ""
  
      admin_view = context['admin_view']
      nodes = []
      method_name = 'block_%s' % block_name
  
      cls_str = str if six.PY3 else basestring
      for view in [admin_view] + admin_view.plugins:
          if hasattr(view, method_name) and callable(getattr(view, method_name)):
              block_func = getattr(view, method_name)
              result = block_func(context, nodes, *args, **kwargs)
              if result and isinstance(result, cls_str):
                  nodes.append(result)
      if nodes:
          return mark_safe(''.join(nodes))
      else:
          return ""
  
  
  @register.filter
  def admin_urlname(value, arg):
      return 'xadmin:%s_%s_%s' % (value.app_label, value.model_name, arg)
  
  static = register.simple_tag(static)
  
  
  @register.simple_tag(takes_context=True)
  def vendor(context, *tags):
      return util_vendor(*tags).render()
  
  
  class BlockcaptureNode(template.Node):
      """https://chriskief.com/2013/11/06/conditional-output-of-a-django-block/"""
  
      def __init__(self, nodelist, varname):
          self.nodelist = nodelist
          self.varname = varname
  
      def render(self, context):
          output = self.nodelist.render(context)
          context[self.varname] = str(output)
          return ''
  
  
  @register.tag(name='blockcapture')
  def do_blockcapture(parser, token):
      try:
          tag_name, args = token.contents.split(None, 1)
      except ValueError:
          raise template.TemplateSyntaxError("'blockcapture' node requires a variable name.")
  
      nodelist = parser.parse(('endblockcapture',))
      parser.delete_first_token()
  
      return BlockcaptureNode(nodelist, args)
  
new_contents: from django import template
  from django.template import Library
  from django.utils import six
  from django.utils.safestring import mark_safe
  from django.utils.html import escape
  
  from xadmin.util import static, vendor as util_vendor
  
  register = Library()
  
  
  @register.simple_tag(takes_context=True)
  def view_block(context, block_name, *args, **kwargs):
      if 'admin_view' not in context:
          return ""
  
      admin_view = context['admin_view']
      nodes = []
      method_name = 'block_%s' % block_name
  
      cls_str = str if six.PY3 else basestring
      for view in [admin_view] + admin_view.plugins:
          if hasattr(view, method_name) and callable(getattr(view, method_name)):
              block_func = getattr(view, method_name)
              result = block_func(context, nodes, *args, **kwargs)
              if result and isinstance(result, cls_str):
                  nodes.append(result)
      if nodes:
          return mark_safe(''.join(nodes))
      else:
          return ""
  
  
  @register.filter
  def admin_urlname(value, arg):
      return 'xadmin:%s_%s_%s' % (value.app_label, value.model_name, arg)
  
  
  static = register.simple_tag(static)
  
  
  @register.simple_tag(takes_context=True)
  def vendor(context, *tags):
      return util_vendor(*tags).render()
  
  
  class BlockcaptureNode(template.Node):
      """https://chriskief.com/2013/11/06/conditional-output-of-a-django-block/"""
  
      def __init__(self, nodelist, varname):
          self.nodelist = nodelist
          self.varname = varname
  
      def render(self, context):
          output = self.nodelist.render(context)
          context[self.varname] = escape(output)
          return ''
  
  
  @register.tag(name='blockcapture')
  def do_blockcapture(parser, token):
      try:
          tag_name, args = token.contents.split(None, 1)
      except ValueError:
          raise template.TemplateSyntaxError("'blockcapture' node requires a variable name.")
  
      nodelist = parser.parse(('endblockcapture',))
      parser.delete_first_token()
  
      return BlockcaptureNode(nodelist, args)
  
subject: 修改inline 点加号出现的问题