如何HSTORE
使用 Flask-Admin 更新字段?
常规ModelView
不会HSTORE
在编辑视图中显示该字段。它什么也没显示。完全没有控制力。在列表视图中,它以 JSON 表示法显示包含数据的列。这对我来说没问题。
使用自定义ModelView
,我可以将HSTORE
字段更改为 TextAreaField。这将在编辑视图中以 JSON 表示法向我显示 HSTORE 字段。但我无法编辑/更新它。在列表视图中,它仍然以 JSON 表示法向我显示对象。在我看来很好。
class MyView(ModelView):
form_overrides = dict(attributes=fields.TextAreaField)
当我尝试保存/编辑 JSON 时,收到此错误:
sqlalchemy.exc.InternalError
InternalError: (InternalError) Unexpected end of string
LINE 1: UPDATE mytable SET attributes='{}' WHERE mytable.id = ...
^
'UPDATE mytable SET attributes=%(attributes)s WHERE mytable.id = %(mytable_id)s' {'attributes': u'{}', 'mytable_id': 14L}
现在 - 使用代码,我可以将一些东西保存到 HSTORE 字段中:
class MyView(ModelView):
form_overrides = dict(attributes=fields.TextAreaField)
def on_model_change(self, form, model, is_created):
model.attributes = {"a": "1"}
return
这基本上覆盖了模型并将这个对象放入其中。然后我可以在列表视图和编辑视图中看到该对象。仍然不够好——我想保存/编辑用户输入的对象。
我尝试将表单中的内容解析并保存到 JSON 中并退出。这不起作用:
class MyView(ModelView):
form_overrides = dict(attributes=fields.TextAreaField)
def on_model_change(self, form, model, is_created):
x = form.data['attributes']
y = json.loads(x)
model.attributes = y
return
json.loads(x) 是这样说的:
ValueError ValueError:期望属性名称:第 1 行第 1 列(字符 1)
以下是一些失败的示例输入:
{u's': u'ff'}
{'s':'ff'}
但是,此输入有效:
{}
空白也有效
这是我的 SQL 表:
CREATE TABLE mytable (
id BIGSERIAL UNIQUE PRIMARY KEY,
attributes hstore
);
这是我的 SQA 模型:
class MyTable(Base):
__tablename__ = u'mytable'
id = Column(BigInteger, primary_key=True)
attributes = Column(HSTORE)
这是我将视图添加到管理对象的方式
admin.add_view(ModelView(models.MyTable, db.session))
使用自定义模型视图添加视图
admin.add_view(MyView(models.MyTable, db.session))
但我不会同时执行这些视图——我得到一个蓝图名称冲突错误——单独的问题)
我还尝试使用表单字段转换器。我无法让它真正命中代码。
class MyModelConverter(AdminModelConverter):
def post_process(self, form_class, info):
raise Exception('here I am') #but it never hits this
return form_class
class MyView(ModelView):
form_overrides = dict(attributes=fields.TextAreaField)