Flask - 使用 flask-wtforms 和 QuerySelect 渲染一个 select 字段
Flask - Render a select field with flask-wtforms and QuerySelect
我正在尝试呈现一个包含 3 个文本字段和一个 select 字段的表单。我可以使用数据库中的数据呈现文本字段,但不能使用 select 字段。
select 字段必须将来自数据库的数据和其他选项显示为 selected 选项。
我在用着:
Flask-SQLAlchemy==2.1
Flask-WTF==0.12
这是代码:
查看
@app.route('/gateway/edit/<int:gwt_id>', methods=['GET','POST'])
def gateway_edit(gwt_id):
q = Device.query.filter_by(gtw_id=gwt_id).first()
form = Gateway(obj=q)
form.populate_obj(q)
return render_template('gateway.html', form=form)
型号
class Gateway(db.Model):
__tablename__ = "gateway"
gateway_id = db.Column(db.Integer, primary_key=True)
gateway_name = db.Column(db.String(64))
gateway_desc = db.Column(db.String(64))
devices = db.relationship('Device', backref='gateway', lazy='dynamic')
class Device(db.Model):
__tablename__ = "device"
device_id = db.Column(db.Integer, primary_key=True)
device_name = db.Column(db.String(64))
device_desc = db.Column(db.String(64))
gateway_id = db.Column(db.Integer,db.ForeignKey('gateway.gateway_id'))
device_ip = db.Column(db.String(64))
形式
class Gateway(Form):
gateway_name = StringField('Gateway Name')
gateway_desc = TextAreaField('Gateway Description')
def gtws():
return Gateway.query
class Device(Form):
device_name = StringField('Device Name')
device_desc = TextAreaField('Device Description')
device_ip = StringField('Device IP')
gtw_group = QuerySelectField('Gateway',query_factory=gtws)
模板
{{ render_field(form.device_name, class="form-control")}}
{{ render_field(form.device_desc, class="form-control")}}
{{ render_field(form.device_ip, class="form-control")}}
{{ render_field(form.gtw_group, class="form-control")}}
提前致谢,
我发现了问题。我误解了模型中的 backref。它在我的设备模型中创建了一个虚拟列。然后我可以使用这个虚拟列名称关联表单字段(在我的例子中是 QuerySelectField)。
我对代码做了一些简单的改动:
型号
devices = db.relationship('Device', backref='gtw', lazy='dynamic')
表格
gtw = QuerySelectField('Gateway',query_factory=gtws)
模板
{{ render_field(form.gtw, class="form-control")}}
我正在尝试呈现一个包含 3 个文本字段和一个 select 字段的表单。我可以使用数据库中的数据呈现文本字段,但不能使用 select 字段。 select 字段必须将来自数据库的数据和其他选项显示为 selected 选项。 我在用着: Flask-SQLAlchemy==2.1 Flask-WTF==0.12
这是代码:
查看
@app.route('/gateway/edit/<int:gwt_id>', methods=['GET','POST'])
def gateway_edit(gwt_id):
q = Device.query.filter_by(gtw_id=gwt_id).first()
form = Gateway(obj=q)
form.populate_obj(q)
return render_template('gateway.html', form=form)
型号
class Gateway(db.Model):
__tablename__ = "gateway"
gateway_id = db.Column(db.Integer, primary_key=True)
gateway_name = db.Column(db.String(64))
gateway_desc = db.Column(db.String(64))
devices = db.relationship('Device', backref='gateway', lazy='dynamic')
class Device(db.Model):
__tablename__ = "device"
device_id = db.Column(db.Integer, primary_key=True)
device_name = db.Column(db.String(64))
device_desc = db.Column(db.String(64))
gateway_id = db.Column(db.Integer,db.ForeignKey('gateway.gateway_id'))
device_ip = db.Column(db.String(64))
形式
class Gateway(Form):
gateway_name = StringField('Gateway Name')
gateway_desc = TextAreaField('Gateway Description')
def gtws():
return Gateway.query
class Device(Form):
device_name = StringField('Device Name')
device_desc = TextAreaField('Device Description')
device_ip = StringField('Device IP')
gtw_group = QuerySelectField('Gateway',query_factory=gtws)
模板
{{ render_field(form.device_name, class="form-control")}}
{{ render_field(form.device_desc, class="form-control")}}
{{ render_field(form.device_ip, class="form-control")}}
{{ render_field(form.gtw_group, class="form-control")}}
提前致谢,
我发现了问题。我误解了模型中的 backref。它在我的设备模型中创建了一个虚拟列。然后我可以使用这个虚拟列名称关联表单字段(在我的例子中是 QuerySelectField)。
我对代码做了一些简单的改动: 型号
devices = db.relationship('Device', backref='gtw', lazy='dynamic')
表格
gtw = QuerySelectField('Gateway',query_factory=gtws)
模板
{{ render_field(form.gtw, class="form-control")}}