Stackoverflow 社区大家好,
我正在尝试学习 Flask-Admin。该文档是一个非常好的开始,但是我发现了一个非常具体的用例,但我无法解决。我在 PostgreSQL 中有一个变量表。我选择这种方法是因为我有很多变量,但它们不共享相同的属性(例如,该区域没有属性电子邮件)。
变量 | 价值 |
---|---|
用户1 |
|
区域1 |
|
我希望拥有最终用户可以自己编辑变量的功能。当然,他们对 JSON 没有任何了解,因此渲染这些字段会很好。目前它是 JSON 值所在的一个字段。如果 Flask-Admin 的编辑视图中的每个项目都有一个字段,那就完美了。例如,这意味着编辑
User1
变量会显示 2 个字段,一个用于姓名,一个用于电子邮件。
几个月后终于找到解决方案!
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"))