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')
...
Klan.query.all powinien być Clan.query.all(), aby działał na flask-admin 1.4.0 –