【问题标题】:How can I embed extra column/external URLs in Flask-appbuilder list/detail model view?如何在 Flask-appbuilder 列表/详细模型视图中嵌入额外的列/外部 URL?
【发布时间】:2018-04-28 19:16:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: flask-appbuilder


    【解决方案1】:

    我在 FAB 的问题站点 Github 上找到了解决方案。在models.py中,你可以定义一个方法,然后使用views.py中的方法。然后资源列表页面会将方法视为附加列。这个解决方案有个缺点,你必须在模型方法中编写 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}
            ),
        ]
    

    【讨论】:

      猜你喜欢
      • 2017-05-11
      • 1970-01-01
      • 2020-02-02
      • 2018-03-31
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      相关资源
      最近更新 更多