我必须创建许多RadioField,我认为动态生成它们会很好,但是我无法使代码正常工作。我正在使用Flask和flask-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')
Flask应用程序:
import GeneratorForm
form = GeneratorForm
form.radio_one = form.binary_generator('test label', 'yes', 'no')
render_template('file.html', form=form)
Jinja:
{{ form.radio_one.label }}
{{ form.radio_one(style="list-style: none") }}
Jinja失败,并显示:wtforms.fields.core.UnboundField object has no attribute label
看起来类binary_generator函数可以正常工作,但不能正确构造表单吗?
答案 0 :(得分:2)
您是否需要binary_generator
中的GenerateForm
方法?
您的GenerateForm可能看起来像这样:
from flask_wtf import FlaskForm
from wtforms import RadioField, SubmitField
class GenerateForm(FlaskForm):
radio_fields = RadioField('', choices=[])
submit = SubmitField('submit')
在flask应用程序中,您需要实例化表单。
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>
答案 1 :(得分:2)
基类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')])]
您还可以通过以下方式创建表单工厂:
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()
然后您可以使用以下方法实例化表单:
Form(2, *(('rad1', [('v1', 'd1'), ('v2', 'd2')]), ('rad2', [('v1', 'd1'), ('v2', 'd2')])))