如何在烧瓶中使用 QuerySelectField? [英] how to use QuerySelectField in flask?

查看:21
本文介绍了如何在烧瓶中使用 QuerySelectField?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试用一个烧瓶形式的 sqlalchemy 请求的结果填充一个选择字段.

I am trying to have a select field filled with the results of a sqlalchemy request in a flask form.

代码如下:

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)

模型(只粘贴了关联表和作者表,很多列都没有问题)

The model (pasted only the associative table and the author table, much of the column are out of the question)

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

我真正想要的是选择字段显示作者姓名和他的编号,并将作者编号返回给应用程序(返回到头部名为add_author"的函数).

What I really want is that the select field show the author name and his number, and return the author number to the app (to the function called "add_author" on the head).

谢谢.

推荐答案

你有两个问题:

  1. 正如 Sean Vieira 在他的回答中指出的那样,query_factory 回调应该返回一个查询,而不是结果.

  1. As Sean Vieira pointed out in his answer, the query_factory callback should return a query, not the results.

query_factory 回调应该返回完整的实体,在您的案例书籍中,而不是书籍 ID.我相信 QuerySelectField 必须尝试使用​​查询结果,就好像它们是映射对象一样,但 ids(作为 KeyedTuple 实例返回)不是.

The query_factory callback should return complete entities, in your case books, not book ids. I believe the QuerySelectField must be trying to use the results of the query as if they are mapped objects but the ids (returned as KeyedTuple instances) are not.

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

I think this is the correct way to code the callback function:

def possible_book():
    return Book.query

这篇关于如何在烧瓶中使用 QuerySelectField?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆