2015-08-01 12 views
5

Sto cercando di utilizzare Flask-Admin per creare un modulo di creazione/modifica per il modello Matrilina illustrato di seguito. Questo modello ha un campo di stringa nome e un campo pod_id con un vincolo di chiave esterna ad un altro modello Pod, che a sua volta ha un campo di chiave esterna per un modello Clan.Modulo Flask-Admin personalizzato con alcune selezioni di campo selezionate impostate in base a un altro campo di selezione

Il modulo predefinito creato da Flask-Admin mostra il nome di campo e un campo di selezione per i Pod casi, ma vorrei aggiungere un campo Clan, che resettare il Pod elenco in base all'istanza Clan selezionata.

Per aggiungere il Clan campo sovrascrivo il modelview predefinito per Matriline e aggiungere un campo aggiuntivo selezionare Clan con tutte le istanze del clan, come mostrato nella MatrilineView vista qui sotto.

Ora ho bisogno di aggiungere del codice Ajax al modulo di rendering per reimpostare l'elenco di pod ogni volta che viene selezionato un nuovo clan.

Devo sostituire completamente il modulo predefinito con uno personalizzato incluso il codice Ajax? O c'è un modo più semplice per farlo con 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') 

... 

risposta

4

siete bisogno di usare un QuerySelectField. Ad esempio:

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 deve essere Clan.query.all() affinché funzioni su flask-admin 1.4.0 –