У меня есть установка с FieldList(FormField(SubForm))
, где SubForm
включает SelectField
, чей выбор определяется во время выполнения (в функции просмотра). В настоящее время у меня есть следующая настройка, которая в основном выводит новый класс для SubForm
с вариантами выбора при каждом его вызове:
from flask import Flask, render_template_string, url_for
from wtforms import SelectField, StringField, FieldList, FormField
from flask_wtf import FlaskForm as Form
app = Flask(__name__)
app.secret_key = 'secret_key'
class BaseForm(Form):
@classmethod
def append_field(cls, name, field):
setattr(cls, name, field)
return cls
class SubForm(BaseForm):
title = StringField('SubForm')
class RootForm(BaseForm):
entries = FieldList(FormField(SubForm))
@app.route('/test/', methods=['GET', 'POST'])
def form_viewer():
form = RootForm(title='Title')
subformclass = SubForm
subformclass = subformclass.append_field('options',
SelectField('Options', choices=[('%i' %i,'option%i' %i) for i in range(1,5)]))
if form.validate_on_submit():
while form.entries:
subform = form.entries.pop_entry()
print(subform.options.data)
else:
print(form.errors)
for entry in range(1,3):
subform = subformclass()
subform.title = 'SubTitle%i' %entry
form.entries.append_entry(subform)
html_template = '''<html>
<form action="{{ url_for('form_viewer') }}" method=post>
{{ form.hidden_tag() }}
{{ form.entries() }}
<input type=submit value=Submit>
</form>
</html>'''
return render_template_string(html_template, form=form)
Моя проблема сейчас в том, что если приложение перезапускается (потому что что-то происходит) между запросами GET и POST, то оно вызывает AttributeError: 'UnboundField' object has no attribute 'data'
при попытке доступа к отправленным данным формы.
Как это можно исправить? Или, может быть, есть другой, лучший способ иметь переменное число SelectField
s с переменным выбором?
редактирование:
Мне кажется, проблема была в том, что после создания FieldList
я изменил SubForm
. Так что теперь я создаю FieldList
аналогичным образом
как SelectField
:
formclass = RootForm.append_field('entries', FieldList(FormField(subformclass)))
Но мне все еще интересно, так ли это, как я должен это делать? Такое ощущение, что может быть более элегантное решение.