如何在Flask-appbuilder列表/详细信息模型视图中嵌入额外的列/外部URL?

时间:2017-11-15 14:07:48

标签: flask-appbuilder

Flask-appbuilder的ModelView可以显示模型的列表和详细信息。非常方便,可以多次保存CURD操作。

有时,除了CURD操作之外,应用程序还需要额外列的更多功能。例如,在IoT相关的Device ModelView中,除了CRUD之外,我想链接到另一个实时计量网页,或者调用设备服务器提供的Web API向设备发送命令。

在其他Python框架中,如Tornado / Cyclone,我将手动设计一个模板页面(带有额外的按钮)和(嵌入额外的)javascript代码。但我仍然不熟悉FAB的结构。

我可以将这些额外的操作作为外部链接到其他公开的方法。并将这些链接添加到模型作为数据字段。但我认为这些设计非常难看。它的网址太长也无法显示。

有更好的想法吗?应该覆盖哪些方法?

1 个答案:

答案 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}
        ),
    ]