docs: def make_view_field(field, obj=None, types_convert_map=None, fields_convert_map=None, 
      value=__default_value__, auto_convert=True):
      """
      If auto_convert, then all values will be converted to string format, otherwise
      remain the orignal value
      """
      from uliweb.utils.textconvert import text2html
      from uliweb.core.html import Tag
      
      old_value = value
  
      types_convert_map = types_convert_map or {}
      fields_convert_map = fields_convert_map or {}
      default_convert_map = {orm.TextProperty:lambda v,o:text2html(v)}
      
      if isinstance(field, dict):
          if 'prop' in field and field.get('prop'):
              prop = field['prop']
          else:
              prop = field
          name = field.get('name')
      else:
          prop = field
          name = prop.property_name
          
      #not real Property instance, then return itself, so if should return
      #just like {'label':xxx, 'value':xxx, 'display':xxx}
      if not isinstance(prop, orm.Property):  
          if old_value is __default_value__:
              value = prop.get('value', '')
          display = prop.get('display', value)
          label = prop.get('label', '') or prop.get('verbose_name', '')
          convert = prop.get('convert', None)
      else:
          if old_value is __default_value__:
              if isinstance(obj, Model):
                  value = prop.get_value_for_datastore(obj)
                  if value is Lazy:
                      getattr(obj, prop.property_name)
                      value = prop.get_value_for_datastore(obj)
              else:
                  value = obj[name]
          if auto_convert or prop.choices:
              display = prop.get_display_value(value)
          else:
              display = value
          
          if isinstance(field, dict):
              initial = field.get('verbose_name', None)
          else:
              initial = ''
          label = initial or prop.verbose_name or name
          
      if name in fields_convert_map:
          convert = fields_convert_map.get(name, None)
      else:
          if isinstance(prop, orm.Property):
              convert = types_convert_map.get(prop.__class__, None)
              if not convert:
                  convert = default_convert_map.get(prop.__class__, None)
      
      convert_result = None
      if convert:
          convert_result = convert(value, obj)
      
      if convert_result is None:
          if value is not None:
              if isinstance(prop, orm.ManyToMany):
                  s = []
                  #support value parameter, the old value is already stored in "old_value" variable
                  if old_value is not __default_value__:
                      if prop.reference_fieldname == 'id':
                          query = []
                          for _id in old_value:
                              _v = functions.get_cached_object(prop.reference_class, _id)
                              query.append(_v)
                      else:
                          query = prop.reference_class.filter(prop.reference_class.c[prop.reversed_fieldname].in_(old_value))
                  else:
                      if prop.reference_fieldname == 'id':
                          query = []
                          _ids = prop.get_value_for_datastore(obj, cached=True)
                          for _id in _ids:
                              _v = functions.get_cached_object(prop.reference_class, _id)
                              if not _v:
                                  log.debug("Can't find object %s:%d" % (prop.reference_class.__name__, _id))
                                  _v = _id
                              query.append(_v)
                      else:
                          query = getattr(obj, prop.property_name).all()
                          
                  for x in query:
                      if isinstance(x, orm.Model):
                          s.append(get_obj_url(x))
                      else:
                          s.append(str(x))
                  display = ' '.join(s)
              elif isinstance(prop, orm.ReferenceProperty) or isinstance(prop, orm.OneToOne):
                  try:
                      if old_value is not __default_value__:
                          d = prop.reference_class.c[prop.reference_fieldname]
                          if prop.reference_fieldname == 'id':
                              v = functions.get_cached_object(prop.reference_class, old_value)
                          else:
                              v = prop.reference_class.get(d==old_value)
                      if not isinstance(obj, Model):
                          d = prop.reference_class.c[prop.reference_fieldname]
                          if prop.reference_fieldname == 'id':
                              v = functions.get_cached_object(prop.reference_class, value)
                          else:
                              v = prop.reference_class.get(d==value)
                      else:
                          if prop.reference_fieldname == 'id':
                              v = functions.get_cached_object(prop.reference_class, obj.get_datastore_value(prop.property_name))
                          else:
                              v = functions.get_cached_object(prop.reference_class,
                                      condition=prop.reference_class.c[prop.reference_fieldname]==obj.get_datastore_value(prop.property_name))
                  except orm.Error:
                      display = prop.get_datastore_value(obj) or ''
                      v = None
                  if isinstance(v, Model):
                      display = get_obj_url(v)
                  else:
                      display = str(v if v is not None else '')
              elif isinstance(prop, orm.FileProperty):
                  url = functions.get_href(value)
                  if url:
                      display = str(Tag('a', value, href=url))
                  else:
                      display = ''
  #            if isinstance(prop, orm.Property) and prop.choices is not None:
  #                display = prop.get_display_value(value)
              if prop.__class__ is orm.TextProperty:
                  display = text2html(value)
         
      else:
          display = convert_result
          
      if isinstance(display, unicode):
          display = display.encode('utf-8')
      if display is None:
          display = ''
          
      return Storage({'label':label, 'value':value, 'display':display, 'name':name})