Flask-WTF model_form, Sqlalchemy and foreign keys

I am trying to take my model and generate forms using wtform model_form for sqlalchemy. I would like fields with a foreign key constraint to be a selection list of all the elements in this table.

Until now, I can neither get anything, nor just enter text for a literal foreign key, and I have lost a bit.

OK, so I have a relatively simple data model. To do this, I can reduce it to where I have the types of equipment, and their support statuses. I want to be able to add support statuses in the future and provide more useful descriptions for them.

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.

Now my view looks like this:

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)

So, I obviously tried the exclude_fk maneuver, but that just gives me a text box for an integer.

, - , Status, , , repr.

exclude_fk QuerySelectField ? -, field_args? - ?

, , .

+4
1

Hardware.status Hardware.status_id, Hardware, :

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

model_form

0

All Articles