1

これが私が持っているコードで、これは機能します。MyFormのみを定義するフォーム クラスRadioFieldです。RadioFieldに含まれるアイテムがまだわからないため、ここではデフォルトは指定されていません。項目のリストを取得し、項目を に追加してmy_formを作成し、(重要なことに) リスト内の最初の項目をデフォルトとして選択します。MyFormRadioField

from wtforms.fields.core import RadioField
from wtforms.validators import Required
from flask_wtf.form import Form

class MyForm(Form):
    """
    User chooses an item.
    """
    itemid = RadioField(validators=[Required()])

def my_form(items):
    """
    Returns a MyForm object populated with appropriate items.
    """
    form = MyForm()
    form.itemid.choices = [(item.id, item.name)
        for item in sorted(items, key=lambda i: i.order)]
    if items and form.itemid.data == u'None':
        # None ensures we don't overwrite submitted data
        form.itemid.data = items[0].id
    return form

小切手and form.itemid.data == u'None'は本当にひどいにおいがします。その理由は、そのチェックがなければ、送信されたデータを上書きしてしまうからです。つまり、このようなフォームを使用すると...

@APP.route('/page_one', methods=['GET', 'POST'])
def page_one():
    form = my_form(dynamic_items())
    if form.validate_on_submit():
        itemid = form.itemid.data
        return redirect(url_for('page_two', itemid=itemid))
    else:
        return render_template('page_one.html', form=form)

...その臭いチェックがない場合は、デフォルトを設定するようにフォームデータを設定しますがform.validate_on_submit()、ユーザーがフォームを送信したために合格する場合は、デフォルトを設定することで実際のデータを上書きしましたユーザーが送信したデータ。

もちろん、明らかな答えはmy_form、デフォルトを設定するだけであるように思われるため、臭いチェックは次のようになります。

if items:
    form.itemid.default = items[0].id

しかし、どうやら form.itemid.data にはデータがなく、それが実際に HTML の構築に使用されているため、これは機能しません。

問題は、これを行う正しい方法は何ですか?

4

1 に答える 1

0

my_form()フォームの作成とフォームの検証の両方に使用しているようです。電話する必要がありますか:

form = my_form(create_items())

または、単に使用できます:

form = MyForm()
if form.validate_on_submit():
    ...

次にmy_form()、フォーム作成専用です。

于 2013-06-17T14:40:03.930 に答える