Привет сообщество Stackoverflow!
Я пытаюсь изучить Flask-Admin. Документация — очень хорошее начало, однако я нашел очень специфический вариант использования, который не могу решить. У меня есть таблица переменных в PostgreSQL. Я выбрал этот подход, поскольку у меня довольно много переменных, но они не имеют одинаковых атрибутов (например, у региона нет адреса электронной почты).
{"name": "Name", "email": "[email protected]"}
Регион1
{"region": "Europe", "name": "DHL", "color": "blue"}Я хотел бы иметь возможность самостоятельного редактирования переменных конечным пользователем. Конечно, у них нет никаких знаний о 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"))