动态生成flask wtf表单

动态生成flask wtf表单,flask,flask-wtforms,wtforms,Flask,Flask Wtforms,Wtforms,我必须制作很多无线电场,我认为动态生成它们会很好,但我无法让代码正常工作。我正在使用烧瓶和烧瓶wtf 表格定义: from flask_wtf import FlaskForm from wtforms import RadioField, SubmitField class GenerateForm(FlaskForm): def binary_generator(self, label_text, yes_text, no_text): return RadioFi

我必须制作很多无线电场,我认为动态生成它们会很好,但我无法让代码正常工作。我正在使用烧瓶和烧瓶wtf

表格定义:

from flask_wtf import FlaskForm
from wtforms import RadioField, SubmitField

class GenerateForm(FlaskForm):
    def binary_generator(self, label_text, yes_text, no_text):
        return RadioField(label_text, choices=[(1, yes_text), (0, no_text)])

    submit = SubmitField('submit')
烧瓶应用程序:

import GeneratorForm

form = GeneratorForm
form.radio_one = form.binary_generator('test label', 'yes', 'no')

render_template('file.html', form=form)
金贾:

{{ form.radio_one.label }}
{{ form.radio_one(style="list-style: none") }}
Jinja失败的原因是:
wtforms.fields.core.UnboundField对象没有属性标签


因此,看起来类binary_generator函数工作正常,但没有正确构造表单?

您需要
GenerateForm
中的
binary_generator
方法吗

您的GenerateForm可能如下所示:

from flask_wtf import FlaskForm
from wtforms import RadioField, SubmitField

class GenerateForm(FlaskForm):
    radio_fields = RadioField('', choices=[])
    submit = SubmitField('submit')
import GeneratorForm

form = GeneratorForm() # Instantiate it

form.radio_fields.label = 'Label Example'
form.radio_fields.choices = [('value_1', 'description'), ('value_2', 'description')] 

render_template('file.html', form=form)
在flask应用程序中,您需要如下实例化表单:

from flask_wtf import FlaskForm
from wtforms import RadioField, SubmitField

class GenerateForm(FlaskForm):
    radio_fields = RadioField('', choices=[])
    submit = SubmitField('submit')
import GeneratorForm

form = GeneratorForm() # Instantiate it

form.radio_fields.label = 'Label Example'
form.radio_fields.choices = [('value_1', 'description'), ('value_2', 'description')] 

render_template('file.html', form=form)
要在
file.html
中呈现表单,请执行以下操作:

<form method="post">
    {{ form.hidden_tag() }}
    {{ form.radio_fields.label }}
    {{ form.radio_fields(style='list-style: none') }}
    {{ form.submit }}
</form>

{{form.hidden_tag()}}
{{form.radio_fields.label}
{{form.radio_字段(style='list-style:none')}
{{form.submit}

基类
FlaskForm
对其构造相当挑剔。要定义动态表单,请在基类使用
super()
实例化后添加参数。即

class GenerateForm(FlaskForm):
    radio_fields = RadioField('', choices=[])
    submit = SubmitField('submit')

    def __init__(self, label, choices):
        super().__init__()
        self.radio_fields.choices = label
        self.radio_fields.choices = choices
然后,您可以使用以下命令实例化表单:

GenerateForm('My Label', [('val', 'desc'), ('val2', 'desc2')])]
Form(2, *(('rad1', [('v1', 'd1'), ('v2', 'd2')]), ('rad2', [('v1', 'd1'), ('v2', 'd2')])))
也可以通过以下方式创建表单工厂:

def Form(n, *args):
    class FormGenerator(FlaskForm):
        submit = SubmitField('submit')

    for i in range(n):
        setattr(FormGenerator, RadioField(args[i][0], choices=args[i][1])

    return FormGenerator()
然后,您可以使用以下命令实例化表单:

GenerateForm('My Label', [('val', 'desc'), ('val2', 'desc2')])]
Form(2, *(('rad1', [('v1', 'd1'), ('v2', 'd2')]), ('rad2', [('v1', 'd1'), ('v2', 'd2')])))