Linking together two tables and trying to create a form that with foreign key in it.
sqlalchemy.exc.InterfaceError
InterfaceError: unprintable InterfaceError object
datbase link done as :
class Client(db.Model):
__tablename__ = 'Client'
..
stand_id = db.Column(db.String(10), index = True, unique = True)
stands = db.relationship('Stand', backref= 'Stand', lazy='select')
def __init__(self,client_name,contact_number,contact_name,contact_email,stand_id):
self.client_name = client_name
self.contact_number = contact_number
self.contact_email = contact_email
self.contact_name = contact_name
self.stand_id = stand_id
class Stand(db.Model):
__tablename__ = 'Stand'
..
stand_number = db.Column(db.String(10), db.ForeignKey('Client.stand_id' ))
def __repr__(self):
return '<Stand %r>' % (self.stand_id)
def __init__(self, stand_name,items, quantity,install_date,
derig_date,comments,last_update, stand_number):
self.stand_name = stand_name
self.items = items
self.quantity = quantity
self.install_date = install_date
self.derig_date = derig_date
self.comments = comments
self.last_update = last_update
self.stand_number = stand_number
Form as
class StandForm(Form):
stand_name = TextField('stand_name', validators = [Required()])
items = TextAreaField('items', validators = [Required()])
quantity = TextAreaField('quantity', validators = [Required()])
install_date = TextField('install_date',validators = [Required()])
derig_date = TextField('derig_date', validators = [Required()])
comments = TextField('comments', validators = [Required()])
last_update = TextField('last_update', validators = [Required()])
stand_number = QuerySelectField(query_factory=lambda: Client.query.all())
and View as
@app.route('/newstand', methods = ['GET','POST'])
def newstand():
form = StandForm()
if form.validate():
stand = Stand(
request.form['stand_name'], request.form['items'], request.form['quantity'],
request.form['install_date'],request.form['derig_date'], request.form['comments'],
request.form['last_update'], request.form['stand_number'])
form.populate_obj(stand)
db.session.add(stand)
db.session.commit()
return render_template('liststands.html',
stand = stand,
form=form)
else:
flash("Your form contained errors")
return render_template('newstand.html', form = form
I don't think i have written the function quite right, any opinions/help ?
I just ran into this same error, and it looks like it might be a similar problem.
QuerySelectField
returns the complete object, not just the ID. For the above example:
Rename the form field to reflect what it contains:
class StandForm(Form):
...
stand = QuerySelectField(query_factory=lambda: Client.query.all())
And use the ID when constructing the object in your view:
@app.route('/newstand', methods = ['GET','POST'])
def newstand():
form = StandForm()
if form.validate():
stand = Stand(
request.form['stand_name'], request.form['items'], request.form['quantity'],
request.form['install_date'],request.form['derig_date'], request.form['comments'],
request.form['last_update'], request.form['stand'].stand_id)
...
Also, the above example is both constructing the Stand
object with the form contents explicitly, and again by calling form.populate_obj
, which is likely redundant (it will populate all the same fields on the object again), so one of these can probably be removed.
If form.populate_obj
automatically respects foreign keys (which I'd assume it does, though I haven't tried it), then you can simplify your view code to:
@app.route('/newstand', methods = ['GET','POST'])
def newstand():
form = StandForm()
if form.validate():
stand = Stand()
form.populate_obj(stand)
...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With