これが私が持っているコードで、これは機能します。MyForm
のみを定義するフォーム クラスRadioField
です。RadioField
に含まれるアイテムがまだわからないため、ここではデフォルトは指定されていません。項目のリストを取得し、項目を に追加してmy_form
を作成し、(重要なことに) リスト内の最初の項目をデフォルトとして選択します。MyForm
RadioField
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 の構築に使用されているため、これは機能しません。
問題は、これを行う正しい方法は何ですか?