2015-08-01 18 views
5

Próbuję użyć Flask-Admin, aby utworzyć formularz tworzenia/edycji dla modelu Matriline pokazanego poniżej. Model ten ma pole ciąg nazwę i pole pod_id z klucz obcy do innego modelu Pod, która sama ma pole klucza obcego do Clan modelu.Niestandardowy formularz Flask-Admin z niektórymi opcjami wyboru pola ustawionymi zgodnie z innym polem wyboru

The domyślnej postaci stworzonej przez Kolby-admin pokazuje pole nazwę i wybierz pole dla Pod przypadkach, ale chciałbym dodać pole Clan, które zresetować Pod listy według do wybranej instancji Clan.

Aby dodać Klan pole zastąpić domyślny ModelView dla Matriline i dodać dodatkowe Wybierz pole Clan z wszystkich przypadkach klanu, jak pokazano na MatrilineView widoku poniżej.

Teraz muszę dodać kod Ajax do renderowanego formularza, aby zresetować listę strąków za każdym razem, gdy wybierze się nowy klan.

Czy muszę całkowicie zastąpić formularz domyślny niestandardowym, w tym kodem Ajax? Czy istnieje jakiś łatwiejszy sposób na to z 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') 

... 

Odpowiedz

4

Jesteś trzeba użyć QuerySelectField. Na przykład:

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

Klan.query.all powinien być Clan.query.all(), aby działał na flask-admin 1.4.0 –