如何在 Flask-AppBuilder 中使用自定义表单更改选择字段的默认选择?



将我的Flask应用程序更改为Flask应用程序构建器,并遇到了一些问题。我希望使用 url 中的参数更改 SelectField 的默认选择,就像自动表单一样。从以下配置中,当选择第三座建筑物时,我在URL中得到"/rooms/add?_flt_0_building=3"。如何在WTForm中building_id选择他的页面?

房间形式:

class RoomForm(DynamicForm):
building_list = db.session.query(Building).all()
name = StringField('Room name', validators=[DataRequired()])
building_id = SelectField('Building', choices=[(r.id, r.name) for r in building_list], validators=[DataRequired()])
floor_id = StringField('Floor', validators=[DataRequired()])

房间型号:

class Room(Model):
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True, nullable=False)
building_id = Column(Integer, ForeignKey('building.id'), nullable=False)
building = relationship("Building")
floors_id = Column(Integer, ForeignKey('floors.id'), nullable=True)
floor = relationship("Floors")
node = relationship('Nodes', backref='roomkey', lazy='dynamic')
device = relationship('Devices', backref='roomkey2', lazy='dynamic')
def __repr__(self):
return self.name
class Building(Model):
id = Column(Integer, primary_key=True)
name = Column(String(80), unique=True, nullable=False)
floors = Column(Integer)
gunitbuilding = relationship('Room', backref='buildingkey', lazy='dynamic')
def __repr__(self):
return self.name
return self.id

客房景观:

class Rooms(ModelView):
datamodel = SQLAInterface(Room)
show_title = 'Rooms'
add_title = 'Add room'
edit_title = 'Edit room'
list_title = 'Rooms'
list_columns = ['name']
show_fieldsets = [('Summary', {'fields':['name']} )]
search_columns = ['name']
add_columns = ['name','building_id','floor_id']
add_form = RoomForm
class managerooms(MasterDetailView):
datamodel = SQLAInterface(Building)
list_title = 'Buildings'
list_columns = ['name']
related_views = [Rooms]
show_title = 'Buildings'
appbuilder.add_view_no_menu(managerooms)
appbuilder.add_view_no_menu(Rooms)
appbuilder.add_link("Rooms", href="/managerooms/list/1?next=%2Fmanagerooms%2Flist%2F1", icon="", category="Manage")

我想出了一个解决方法。如果有更好的方法,请告诉我。我在 RoomForm 中添加了 refresh((,由于我不确定如何获取完整 url、参数字符串以外的任何内容,因此我减去前 19 个字符以获得正确的建筑编号。

def refresh():
form = RoomForm()
if request.method == 'GET':
a=len(request.query_string)-19
form.building_id.default = int(request.query_string[-a:])
form.process()
return form

最新更新