【问题标题】:flask-admin: prettify json fieldsflask-admin:美化 json 字段
【发布时间】:2019-03-09 07:21:26
【问题描述】:

我真的很喜欢 flask-admin 的 CRUD 功能。 不幸的是,我还没有找到让 json DB 字段更具可读性的方法。

JSON 字段在列表视图(以及编辑视图)中显示为文本字符串。

谁能告诉我从哪里开始美化列表视图(以及后来的编辑视图)?

【问题讨论】:

    标签: flask flask-admin


    【解决方案1】:

    您可以使用column_formatters 自定义列表视图中字段的外观:

    import json
    from flask_admin.contrib.sqla.view import ModelView
    from jinja2 import Markup
    
    def json_formatter(view, context, model, name):
        value = getattr(model, name)
        json_value = json.dumps(value, ensure_ascii=False, indent=2)
        return Markup('<pre>{}</pre>'.format(json_value))
    
    class MyView(ModelView):
        column_formatters = {
            'my_json_field': json_formatter,
        }
    

    或者您可以使用column_type_formatters 将此样式应用于您视图中的所有字典字段:

    import json
    from flask_admin.model import typefmt
    from flask_admin.contrib.sqla.view import ModelView
    from jinja2 import Markup
    
    def json_formatter(view, value):
        json_value = json.dumps(value, ensure_ascii=False, indent=2)
        return Markup('<pre>{}</pre>'.format(json_value))
    
    MY_FORMATTERS = typefmt.BASE_FORMATTERS.copy()
    MY_FORMATTERS[dict] = json_formatter
    
    class MyView(ModelView):
        column_type_formatters = MY_FORMATTERS
    

    在 Stack Overflow 上有 several other examples 使用 flask_admin 格式化程序,但拥有一个特定于 JSON 的情况不会有什么坏处。

    flask_admin.form.fields.JSONField 可以被覆盖以在输入中显示漂亮的值。 form_overrides 属性用于它:

    from flask_admin.contrib.sqla.view import ModelView
    from flask_admin.form import fields
    
    class JSONField(fields.JSONField):
        def _value(self):
            if self.raw_data:
                return self.raw_data[0]
            elif self.data:
                return json.dumps(self.data, ensure_ascii=False, indent=2)
            else:
                return ''
    
    class MyView(ModelView):
        form_overrides = {
            'my_field': JSONField,
        }
    

    【讨论】:

    • 谢谢。格式化程序工作正常,但不显示缩进结构。我相信需要添加标签 <pre> 。关于如何做到这一点的任何建议?</pre>
    • @caliph 你说得对,我忘了。修正了答案。简而言之:您可以在格式化程序函数中使用 HTML 标记,但需要将它们包装在 jinja2.Markup 函数中。
    • 太棒了!非常感谢您的分享!
    猜你喜欢
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 2014-03-08
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多