Flask-WTF: выбор переменных для SelectField в FieldList FormField - PullRequest
0 голосов
/ 10 мая 2018

У меня есть установка с 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)))

Но мне все еще интересно, так ли это, как я должен это делать? Такое ощущение, что может быть более элегантное решение.

...