Flask wtforms - 'UnboundField'对象不可调用,动态字段无法正确初始化

6

app.py

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, FieldList, FormField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'apple pie'


class BookForm(FlaskForm):
    book = StringField('book title')


class LibraryForm(FlaskForm):
    def __init__(self, min_entries=0, *args, **kwargs):
        super(LibraryForm, self).__init__(*args, **kwargs)
        self.books = FieldList(FormField(BookForm), min_entries=min_entries)

    library = StringField('Library name')
    books = FieldList(FormField(BookForm), min_entries=3)
    submit = SubmitField('Submit')


@app.route('/book', methods=['GET', 'POST'])
def book():
    form = LibraryForm(min_entries=5)
    if form.validate_on_submit():
        return 'aww yeah'
    return render_template('books.html', form=form)

books.html

<html>
<form method="POST" action="">
    {{ form.hidden_tag() }}
    <div>{{ form.library.label }}: {{ form.library() }}</div>
    <div>{{ form.books.label }}: {{ form.books() }}</div>
    <div>{{ form.submit.label }}: {{ form.submit() }}</div>
</html>

我的目标是使我的表单以灵活的条目数量初始化,就像链接中显示的示例一样。每当我运行代码时,就会出现以下错误:

TypeError: 'UnboundField' object is not callable

当我注释掉init函数时,表单的工作正常,除了Book Fields数量不够灵活。我花了很多时间寻找答案,但是没有找到解决这个问题的方法。

示例图

非常感谢您提供的任何帮助!

1个回答

3

这不是最理想的解决方案,但它确实可行。

from flask import Flask, render_template
from flask_wtf import FlaskForm, Form
from wtforms import StringField, SubmitField, FieldList, FormField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'apple pie'


class BookForm(FlaskForm):
    book = StringField('book title')


class LibraryForm(FlaskForm):
    library = StringField('Library name')
    books = FieldList(FormField(BookForm))
    submit = SubmitField('Submit')


@app.route('/book', methods=['GET', 'POST'])
def book():
    form = LibraryForm()
    if form.validate_on_submit():
        return 'aww yeah'
    for i in range(6):
        form.books.append_entry()

    return render_template('books.html', form = form)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接