如何在 Flask-Admin 中将 JSON 值显示为单独的字段?

问题描述 投票:0回答:1

Stackoverflow 社区大家好,

我正在尝试学习 Flask-Admin。该文档是一个非常好的开始,但是我发现了一个非常具体的用例,但我无法解决。我在 PostgreSQL 中有一个变量表。我选择这种方法是因为我有很多变量,但它们不共享相同的属性(例如,该区域没有属性电子邮件)。

变量 价值
用户1
{"name": "Name", "email": "[email protected]"}
区域1
{"region": "Europe", "name": "DHL", "color": "blue"}

我希望拥有最终用户可以自己编辑变量的功能。当然,他们对 JSON 没有任何了解,因此渲染这些字段会很好。目前它是 JSON 值所在的一个字段。如果 Flask-Admin 的编辑视图中的每个项目都有一个字段,那就完美了。例如,这意味着编辑

User1
变量会显示 2 个字段,一个用于姓名,一个用于电子邮件。

postgresql flask-admin
1个回答
0
投票

几个月后终于找到解决方案!

Variable = Base.classes.variables

class VariableView(ModelView):
    list_columns = ["variable", "value"]
    form_columns = ["variable", "value"]
    column_default_sort = ("variable", False)
    column_filters = ["variable"]
    column_sortable_list = ["variable"]
    column_searchable_list = ["variable"]
    column_formatters = {
        "variable": lambda view, context, model, name: model.variable.replace(
            "_", " "
        ).capitalize(),
    }
    def edit_form(self, obj):
        class VariableForm(FlaskForm):
            pass

        setattr(
            VariableForm,
            "variable",
            StringField("Variable", validators=[Optional()], default=obj.variable),
        )
        try:
            json_data = json.loads(obj.value)
            for key in json_data:
                setattr(
                    VariableForm,
                    key,
                    StringField(
                        key.capitalize(),
                        validators=[Optional()],
                        default=json_data[key],
                        ),
                    )
        except json.decoder.JSONDecodeError:
            setattr(
                VariableForm,
                "Value",
                StringField("Label", validators=[Optional()], default=obj.value),
            )
        return VariableForm(obj=obj)

    def on_model_change(self, form, model, is_created):
        # Update the model with the data from the form
        json_output = {}
        for field in form:
            if field.name == "value":
                return model
            if field.name != "variable" and field.name != "csrf_token":
                json_output[field.name] = field.data
        model.value = json.dumps(json_output)
        return model

admin.add_view(VariableView(Variable, user.session, name="Variables"))
© www.soinside.com 2019 - 2024. All rights reserved.