2015-08-01 15 views
5

Ich versuche Flask-Admin zu verwenden, um ein Erstellungs-/Bearbeitungsformular für das unten gezeigte Modell Matriline zu erstellen. Dieses Modell hat einen String-Feld Namen und ein Feld pod_id mit einem Fremdschlüssel zu einem anderen Modell Pod, die sie ein Fremdschlüsselfeld zu einem Clan Modell haben.Benutzerdefiniertes Flask-Admin-Formular mit einigen Auswahlfeld-Einstellungen gemäß einem anderen Auswahlfeld

Das Formular standardmäßig erstellt von Flask-Admin zeigt den Namen Feld und ein Auswahlfeld für die Pod Instanzen, aber ich möchte ein Feld Clan, hinzuzufügen, die die Pod Liste zurücksetzen würde nach zum Clan Instanz ausgewählt.

Um das Clan Feld mir den Standard-Modelview für Matriline und fügen ein zusätzliches Auswahlfeld Clan mit allen Clan Instanzen außer Kraft hinzufügen, wie unten in der Ansicht MatrilineView gezeigt.

Jetzt muss ich dem gerenderten Formular etwas Ajax-Code hinzufügen, um die Liste der Pods jedes Mal neu zu setzen, wenn ein neuer Clan ausgewählt wird.

Muss ich das Standardformular vollständig durch ein benutzerdefiniertes Formular ersetzen, das den Ajax-Code enthält? Oder gibt es einen einfacheren Weg mit Flask-Admin?

<b>models.py</b> 

... 

class Matriline(db.Model): 
    __tablename__ = 'matriline' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(64)) 
    pod_id = db.Column(db.Integer, db.ForeignKey('pod.id')) 

    def __unicode__(self): 
     return self.name 


class Pod(db.Model): 
    __tablename__ = 'pod' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(64)) 
    matrilines = db.relationship('Matriline', backref='pod', lazy='select') 
    clan_id = db.Column(db.Integer, db.ForeignKey('clan.id')) 

    def __unicode__(self): 
     return self.name 


class Clan(db.Model): 
    __tablename__ = 'clan' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.Unicode(64)) 
    pods = db.relationship('Pod', backref='clan', lazy='select') 

    def __unicode__(self): 
     return self.name 

... 

<b>views.py</b> 

from flask_admin.contrib import sqla 
from wtforms import SelectField 
from orcall import models 


class MatrilineView(sqla.ModelView): 
    column_hide_backrefs = False 
    form_extra_fields = { 
     'clan': SelectField('Clan', 
      choices=[ (c.id, c.name) for c in models.Clan.query.all()]) 
    } 
    column_list = ('name', 'pod', 'clan') 

... 

Antwort

4

Sie sind brauchen eine QuerySelectField zu verwenden. Zum Beispiel:

from flask.ext.admin.form import Select2Widget 

class MatrilineView(sqla.ModelView): 
    column_hide_backrefs = False 
    form_extra_fields = { 
     'clan': sqla.fields.QuerySelectField(
      label='Clan', 
      query_factory=lambda: Clan.query.all, 
      widget=Select2Widget() 
     ) 
    } 
    column_list = ('name', 'pod', 'clan') 
+0

Clan.query.all sollte Clan.query.all() sein, damit es auf flask-admin 1.4.0 funktioniert –

Verwandte Themen