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