【问题标题】:Flask-WTF model_form, Sqlalchemy, and foreign keysFlask-WTF model_form、Sqlalchemy 和外键
【发布时间】:2015-04-07 08:13:26
【问题描述】:

我正在尝试获取我的模型并使用 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

时髦。

现在我的视图是这样的:

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 中传递一些东西吗?我在做傻事吗?

我想在这里尽可能少做人工干预,我觉得这是一个相当教科书的场景。

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy wtforms flask-wtforms


    【解决方案1】:

    Hardware.status 列应命名为 Hardware.status_id,并且您应在 Hardware 中添加一个表示与状态表的关系的列:

    status = db.relationship('Status',backref='hardware',lazy='dynamic')
    

    这应该会为您提供一个带有状态选择的 model_form

    【讨论】:

      猜你喜欢
      • 2016-03-09
      • 2017-05-24
      • 2017-08-28
      • 1970-01-01
      • 2014-04-07
      • 2011-04-20
      • 2015-02-02
      • 1970-01-01
      • 2020-09-23
      相关资源
      最近更新 更多