簡體   English   中英

如何在燒瓶中使用QuerySelectField?

[英]how to use QuerySelectField in flask?

我正在嘗試使用燒瓶形式填充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

我真正想要的是,選擇字段顯示作者姓名和他的號碼,並將作者號碼返回給應用程序(到頭部的名為“add_author”的函數)。

謝謝。

你有兩個問題:

  1. 正如Sean Vieira在他的回答中指出的那樣, query_factory回調應該返回一個查詢,而不是結果。

  2. query_factory回調應返回完整的實體,在您的案例簿中,而不是書籍ID。 我相信QuerySelectField必須嘗試使用​​查詢的結果,就好像它們是映射對象,但是id(作為KeyedTuple實例返回)不是。

我認為這是編寫回調函數的正確方法:

def possible_book():
    return Book.query

一個可能的問題是wtforms.ext.sqlalchemy.fields.QuerySelectField需要一個SQLAlchemy查詢對象,而不是一個物化列表。 只需從possible_book返回中刪除all()調用,即可向WTForms返回未實現的查詢:

def possible_book():
    return Book.query.with_entities(Book.id)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM