【发布时间】:2019-02-16 10:09:41
【问题描述】:
我想更改关系在模型的 Flask-Admin 索引视图中的显示方式。我确实有两个模型通过多对多关系连接,它们也显示在管理索引视图中。不幸的是,这些关系只是使用逗号分隔,因此用户可能会很快失去概览。理想情况下,我想将关系条目转换为一个简单的列表(例如 HTML 中的 li)。
有没有简单的方法来实现这一点?
非常感谢!
【问题讨论】:
标签: python flask flask-sqlalchemy flask-admin
我想更改关系在模型的 Flask-Admin 索引视图中的显示方式。我确实有两个模型通过多对多关系连接,它们也显示在管理索引视图中。不幸的是,这些关系只是使用逗号分隔,因此用户可能会很快失去概览。理想情况下,我想将关系条目转换为一个简单的列表(例如 HTML 中的 li)。
有没有简单的方法来实现这一点?
非常感谢!
【问题讨论】:
标签: python flask flask-sqlalchemy flask-admin
您可以使用<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
【讨论】:
好的...我自己想通了:您可以通过覆盖函数 _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