2017-11-15 3 views
0

Flask-Appbuilders ModelView kann Liste und Details für ein Modell anzeigen. Sehr praktisch und speichern Sie viele Male für CURD-Operationen.Wie kann ich zusätzliche Spalten/externe URLs in die Flask-Appbuilder-Liste/Detailmodellansicht einbetten?

Manchmal erfordert die Anwendung mehr Funktionen mit zusätzlichen Spalten neben CURD-Operationen. Zum Beispiel möchte ich in einem IoT-bezogenen Device ModelView neben CRUD eine Verknüpfung zu einer anderen Realtime-Gauge-Webseite herstellen oder die vom Device Server angebotene Web-API aufrufen, um Befehle an das Gerät zu senden.

In anderen Python-Framework, wie Tornado/Cyclone, werde ich manuell eine Vorlage Seite (mit zusätzlichen Tasten) und (einbetten extra) Javascript-Code. Aber ich kenne die Struktur von FAB noch nicht.

Ich kann diese zusätzlichen Operationen als externe Links zu anderen exponierten Methoden machen. Und fügen Sie diese Links zu Modellen als Datenfelder hinzu. Aber ich denke, dass dieses Design ziemlich hässlich ist. Und die URL ist zu lang, um angezeigt zu werden.

Irgendwelche besseren Ideen? Welche Methoden sollten überschrieben werden?

Antwort

0

Ich fand eine Lösung von FAB-Ausgaben Website unter Github. In models.py können Sie eine Methode definieren und dann die Methode in views.py verwenden. Dann behandelt die Ressourcenliste die Methode als zusätzliche Spalte. Diese Lösung hat den Nachteil, dass Sie HTML in eine Modellmethode schreiben müssen.

Hier ist mein Code.

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} 
     ), 
    ] 
Verwandte Themen