我试图使用我的模型并使用wtform的model_form为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
Groovy的。
现在我的观点如下:
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)
所以我显然尝试了exclude_fk操作,但这只是给了一个整数的文本字段。
我觉得我需要告诉使用Status中的name字段,尽管我猜这可以从 repr 方法中获得。
我是否需要删除exclude_fk并手动将QuerySelectField添加到表单中?我应该在field_args中传递一些东西吗?我在做一些蠢事吗?
我想在这里做尽可能少的人工干预,我觉得这是一个相当教科书的场景。
答案 0 :(得分:0)
Hardware.status
列应命名为Hardware.status_id
,您应该向Hardware
添加一列,以表示与状态表的关系:
status = db.relationship('Status',backref='hardware',lazy='dynamic')
应该为您提供一个带状态选择
的model_form