Python Flask WTF model_表单、Sqlalchemy和外键

Python Flask WTF model_表单、Sqlalchemy和外键,python,sqlalchemy,flask-sqlalchemy,wtforms,flask-wtforms,Python,Sqlalchemy,Flask Sqlalchemy,Wtforms,Flask Wtforms,我试图采用我的模型,并使用wtform的sqlalchemy模型表单生成表单。我希望带有外键约束的字段是该表中所有项的选择列表 到目前为止,对于文本外键,我要么什么也得不到,要么得到一个简单的文本输入,我有点迷路了 好的,我这里有一个相对简单的数据模型。为此,我可以将其缩减到我拥有的硬件类型及其支持状态。我希望将来能够添加支持状态,并为它们提供更有用的描述 from . import db class Status(db.Model): """Support status"""

我试图采用我的模型,并使用wtform的sqlalchemy模型表单生成表单。我希望带有外键约束的字段是该表中所有项的选择列表

到目前为止,对于文本外键,我要么什么也得不到,要么得到一个简单的文本输入,我有点迷路了

好的,我这里有一个相对简单的数据模型。为此,我可以将其缩减到我拥有的硬件类型及其支持状态。我希望将来能够添加支持状态,并为它们提供更有用的描述

from . import db
class Status(db.Model):
    """Support status"""
    __tablename__ = 'status'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique=True)
    description = db.Column(db.Text)
    def __repr__(self):
        return self.name

class Hardware(db.Model):
    """Hardware"""
    __tablename__ = 'hardware'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(64), unique=True)
    description = db.Column(db.Text)
    status = db.Column(db.Integer, db.ForeignKey('status.id'))
    ...
    def __repr__(self):
        return self.name
棒极了

现在我的观点是这样的:

from flask import render_template, request, flash, redirect, url_for
from flask_wtf import Form
from wtforms.ext.sqlalchemy.orm import model_form
from . import db, app
import models
...
@app.route('/edit/status/', defaults={'id': None}, methods=['GET', 'POST'])
@app.route('/edit/status/<int:id>', methods=['GET', 'POST'])
def edit_hardware(id=None):
    HardwareForm = model_form(models.Hardware, base_class=Form,
            db_session=db.session, exclude_fk=False)
    if id == None:
        model = models.Hardware()
    else:
        model = models.Hardware.query.get(id)
    form = HardwareForm(request.form, model)
    if form.validate_on_submit():
        form.populate_obj(model)
        db.session.add(model)
        db.session.commit()
        flash("yay!")
    return render_template('forms.html', form=form)
从flask导入渲染模板、请求、闪存、重定向、url
来自WASKU wtf进口表格
从wtforms.ext.sqlalchemy.orm导入模型\u表单
从…起导入数据库,应用程序
导入模型
...
@app.route(“/edit/status/”,默认值={'id':None},方法=['GET','POST'])
@app.route('/edit/status/',方法=['GET','POST'])
def编辑硬件(id=无):
硬件形式=模型形式(模型.硬件,基本类=形式,
db_session=db.session,排除_fk=False)
如果id==无:
model=models.Hardware()
其他:
model=models.Hardware.query.get(id)
表单=硬件表单(request.form,model)
if form.validate_on_submit():
表格。填充对象(模型)
db.session.add(模型)
db.session.commit()
闪光(“耶!”)
返回呈现模板('forms.html',form=form)
很明显,我尝试了排除fk策略,但这只给了我一个整数的文本字段

我觉得我需要告诉一些事情来使用Status中的name字段,尽管我猜这可能是从repr方法派生出来的

我是否需要删除exclude_fk并手动将queryselect字段添加到表单中?有什么我应该通过的吗?我在做傻事吗


我希望在这里尽可能少地进行手动干预,我觉得这是一个相当经典的场景。

硬件。状态列应命名为硬件。状态id,您应该在硬件中添加一列,表示与状态表的关系:

status = db.relationship('Status',backref='hardware',lazy='dynamic')
这将为您提供一个带有select for状态的model_表单