如何在flask中使用QuerySelectField?

我试图用一个烧瓶形式的sqlalchemy请求的结果填充选择字段。

这是代码:

def possible_book():

return Book.query.with_entities(Book.id).all()

class AuthorForm(Form):

familyname = TextField('familyname', [validators.Required()])

firstname = TextField('firstname', [validators.Required()])

book_list = QuerySelectField('book_list',query_factory=possible_book,get_label='title',allow_blank=True)

这是模板:

 <form action="" method="post" name="edit_author" enctype="multipart/form-data">

{{form.hidden_tag()}}

<p>Veuillez donner son prénom (obligatoire) : {{form.firstname(value=author.firstname)}}</p>

<p>Nom de famille (obligatoire) : {{form.familyname(value=author.familyname)}}</p>

<p>Livre : {{form.book_list}}</p>

<p><input type="submit" value="Envoyer"></p>

</form>

查看:

@app.route('/edit_author/<number>', methods = ['GET', 'POST'])

def edit_author(number):

if number == 'new':

author = []

else:

author = Author.query.filter_by(id = number).first()

form = AuthorForm()

if form.validate_on_submit():

a = Author(firstname= form.firstname.data, familyname= form.familyname.data)

a.books = form.book_list.data

db.session.add(a)

db.session.commit()

return redirect('/admin')

return render_template('edit_author.html', form = form, author = author)

模型(仅粘贴了关联表和作者表,很多列都不用了)

author_book = db.Table('author_book',

db.Column('author', db.Integer, db.ForeignKey('author.id')),

db.Column('book', db.Integer, db.ForeignKey('book.id'))

)

class Author(db.Model):

id = db.Column(db.Integer, primary_key = True)

firstname = db.Column(db.String(64), index = True)

familyname = db.Column(db.String(120), index = True)

website = db.Column(db.String(120))

dateofbirth = db.Column(db.DateTime)

placeofbirth = db.Column(db.String(120))

nationality = db.Column(db.String(120))

biography = db.Column(db.Text)

photo = db.Column(db.String(120))

books = db.relationship('Book', secondary=author_book,backref=db.backref('author', lazy='dynamic'))

我目前收到此错误:

UnmappedInstanceError: Class 'sqlalchemy.util._collections.KeyedTuple' is not mapped

我真正想要的是select字段显示作者姓名及其编号,然后将作者编号返回到应用程序(返回到头上名为“ add_author”的函数)。

回答:

你有两个问题:

  1. 正如肖恩·维埃拉(Sean Vieira)在回答中指出的那样,query_factory回调应返回查询而不是结果。

  2. query_factory回调应该返回完整实体,你的情况的书籍,而不是书籍ID。我认为QuerySelectField必须尝试使用​​查询结果,就好像它们是映射对象一样,而id(返回为KeyedTuple实例)则不是。

我认为这是编写回调函数的正确方法:

def possible_book():

return Book.query

以上是 如何在flask中使用QuerySelectField? 的全部内容, 来源链接: utcz.com/qa/431338.html

回到顶部