Flask-appbuilder的ModelView可以显示模型的列表和详细信息。非常方便,可以多次保存CURD操作。
有时,除了CURD操作之外,应用程序还需要额外列的更多功能。例如,在IoT相关的Device ModelView中,除了CRUD之外,我想链接到另一个实时计量网页,或者调用设备服务器提供的Web API向设备发送命令。
在其他Python框架中,如Tornado / Cyclone,我将手动设计一个模板页面(带有额外的按钮)和(嵌入额外的)javascript代码。但我仍然不熟悉FAB的结构。
我可以将这些额外的操作作为外部链接到其他公开的方法。并将这些链接添加到模型作为数据字段。但我认为这些设计非常难看。它的网址太长也无法显示。
有更好的想法吗?应该覆盖哪些方法?
答案 0 :(得分:0)
我在Github找到了FAB问题网站的解决方案。在models.py中,您可以定义方法,然后在views.py中使用该方法。然后资源列表页面将该方法视为addtional列。这个解决方案有一个缺点,你必须在模型方法中编写HTML。
这是我的代码。
<强> models.py 强>
class Device(Model):
id = Column(Integer, primary_key = True)
snr = Column(String(256), unique = True)
name = Column(String(128))
addr = Column(String(256))
latitude = Column(Float)
longitude = Column(Float)
status = Column(Enum('init','normal','transfer','suspend'), default = 'init')
owner_id = Column(Integer, ForeignKey('account.id'))
owner = relationship("Account")
def __repr__(self):
return self.name
def get_gauge_url(self):
btn = "<a href=\"/gaugeview/{}\" class=\"btn btn-social-icon\"><i class=\"fa fa-dashboard\"></a>".format(self.id)
return btn
<强> views.py 强>
class DeviceView(ModelView):
datamodel = SQLAInterface(Device)
related_views = [PermitView, EventView]
label_columns = {'snr':'SNR',
'owner_id':'Owner',
'get_gauge_url':'Gauge'}
list_columns = ['name','snr','addr','owner','get_gauge_url']
edit_columns = ['name','snr','owner','addr','latitude','longitude','status',]
add_columns = edit_columns
show_fieldsets = [
('Summary',
{'fields':['name','snr','owner']}
),
('Device Info',
{'fields':['addr','latitude','longitude','status'],'expanded':True}
),
]