简体   繁体   English

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

[英]How do I change the default selection for a selectfield using a custom form with Flask-AppBuilder?

Change my Flask app into a Flask-Appbuilder, and running into some issues. 将我的Flask应用更改为Flask-Appbuilder,并遇到一些问题。 I am looking to change the default selection of a SelectField using the parameter in the url, kind of like the automatic forms do. 我想使用url中的参数来更改SelectField的默认选择,就像自动表单一样。 From the following configuration, I get "/rooms/add?_flt_0_building=3" in the URL when the third building is selected. 通过以下配置,当选择第三座建筑物时,我在URL中获得“ / rooms / add?_flt_0_building = 3”。 How can I get building_id in the WTForm to select his on the page? 如何在WTForm中获取building_id以在页面上选择他?

Room form: 房间形式:

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()])

Room model: 房间型号:

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

Room views: 客房景观:

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")

I figured out a work-around. 我想出了一种解决方法。 If there is a better way please let me know. 如果有更好的方法,请告诉我。 I added refresh() to the RoomForm, and since I am not sure how to get anything other than the full url, parameter string, I subtracted the first 19 characters to get the correct building number. 我在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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM