【问题标题】:How do I change the default selection for a selectfield using a custom form with Flask-AppBuilder?如何使用带有 Flask-AppBuilder 的自定义表单更改选择字段的默认选择?
【发布时间】:2018-12-06 20:07:35
【问题描述】:

将我的 Flask 应用程序更改为 Flask-Appbuilder,并遇到一些问题。我希望使用 url 中的参数更改 SelectField 的默认选择,有点像自动表单。 From the following configuration, I get "/rooms/add?_flt_0_building=3" in the URL when the third building is selected.如何在 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")

【问题讨论】:

    标签: python flask wtforms flask-appbuilder


    【解决方案1】:

    我想出了一个解决方法。如果有更好的方法请告诉我。我在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多