【问题标题】:Flask Admin: Format the way relationships are displayedFlask Admin:格式化关系的显示方式
【发布时间】:2019-02-16 10:09:41
【问题描述】:

我想更改关系在模型的 Flask-Admin 索引视图中的显示方式。我确实有两个模型通过多对多关系连接,它们也显示在管理索引视图中。不幸的是,这些关系只是使用逗号分隔,因此用户可能会很快失去概览。理想情况下,我想将关系条目转换为一个简单的列表(例如 HTML 中的 li)。

有没有简单的方法来实现这一点?

非常感谢!

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-admin


    【解决方案1】:

    您可以使用<br> 标记代替逗号作为分隔符。 见column_type_formatters

    定义默认格式化程序并更新列表类型。

    def lineby_list_formatter(view, values):
        html = u'<br/> '.join(str(v) for v in values)
        return Markup(html)
    
    
    MY_DEFAULT_FORMATTERS = dict(typefmt.BASE_FORMATTERS)
    MY_DEFAULT_FORMATTERS.update({
        list: lineby_list_formatter
    })
    
    
    class EventView(ModelView):
        ...
        column_type_formatters = MY_DEFAULT_FORMATTERS
    
    

    【讨论】:

      【解决方案2】:

      好的...我自己想通了:您可以通过覆盖函数 _get_list_value() 来操纵数据的呈现方式。见下面的代码

          def _get_list_value(self, context, model, name, column_formatters,
                          column_type_formatters):
          """
              Returns the value to be displayed.
      
              :param context:
                  :py:class:`jinja2.runtime.Context` if available
              :param model:
                  Model instance
              :param name:
                  Field name
              :param column_formatters:
                  column_formatters to be used.
              :param column_type_formatters:
                  column_type_formatters to be used.
          """
          column_fmt = column_formatters.get(name)
          if column_fmt is not None:
              value = column_fmt(self, context, model, name)
          else:
              value = self._get_field_value(model, name)
      
          choices_map = self._column_choices_map.get(name, {})
          if choices_map:
              return choices_map.get(value) or value
      
          type_fmt = None
          for typeobj, formatter in column_type_formatters.items():
              if isinstance(value, typeobj):
                  type_fmt = formatter
                  break
          if type_fmt is not None:
              value = type_fmt(self, value)
      
          ### overwritten here
      
          if name == 'items':
      
              html_string  = '<ul>'
              for item in value.split(','):
                  html_string += '<li> {} </li>'.format(item)
              html_string += '</ul>'
              value = Markup(html_string)
      
      
          return value
      

      【讨论】:

      • 您应该在视图级别使用列格式化程序来实现这一点。见column_formatters
      猜你喜欢
      • 2017-07-10
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多