0

Flask-appbuilder 的 ModelView 可以显示模型的列表和详细信息。非常方便,为 CURD 操作节省了很多时间。

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

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

我可以将这些额外的操作作为其他公开方法的外部链接。并将这些链接添加到模型作为数据字段。但我认为这些设计相当丑陋。它的 URL 也太长而无法显示。

有更好的想法吗?应该重写哪些方法?

4

1 回答 1

0

我在Github上的 FAB 问题网站上找到了解决方案。在models.py中,你可以定义一个方法,然后使用views.py中的方法。然后资源列表页面会将方法视为附加列。该解决方案有一个缺点,您必须在模型方法中编写 HTML。

这是我的代码。

模型.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 

视图.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}
        ),
    ]
于 2017-11-23T10:56:51.890 回答