为问卷中的每个元素生成单选字段
Generate Radio Field for each element in a questionnaire
所以我使用 wtforms 来生成无线电场,但我需要它们是动态的,就像如果有 12 个问题,每个问题都会得到一组无线电场。我尝试了 FormField,它给了我我想要的,但所有问题的名称都是相同的,有没有更好的方法来做到这一点?
输出应该是这样的:
Question
Radiofield1 radioField1
Question
Radiofield2 radioField2
编辑:
我继续完成 HTML 字段,但这真的很有帮助。
我不太记得我做了什么,但这很接近我可以渲染字段但 id 不会改变我尝试将元组传递给
选项 但它为每个问题呈现动态单选字段,而不是为每个问题设置一组
Forms.py
class QuestionRadio(FlaskForm):
rad=RadioField("rad",choices=[(1,'Yes'),(2,'No')],id="opt")
class QuestionForm(FlaskForm):
options=FieldList(FormField(QuestionRadio),min_entries=1)
Views.py
#This is the question list
question=[(ques.id,ques.question) for ques in Questions.query.all()]
form=QuestionForm()
#I don't remember what I did after this
template.html
{% for key,val in question %}
<h4>key. val</h4>
{{form.options}}
{% endfor%}
wforms documentation 建议创建一个虚拟 class 并在您的视图中动态添加字段。
这是文档中的示例:
def my_view():
class F(MyBaseForm):
pass
F.username = StringField('username')
for name in iterate_some_model_dynamically():
setattr(F, name, StringField(name.title()))
form = F(request.POST, ...)
# do view stuff
在您的情况下,代码可能如下所示(未经测试):
def my_view():
class QuestionForm(Form):
pass
for q in Questions.query.all():
field = RadioField(q.question,choices=[(1,'Yes'),(2,'No')],id=q.id)
setattr(QuestionForm, q.id, field)
form = QuestionForm(request.POST, ...)
# do view stuff
所以我使用 wtforms 来生成无线电场,但我需要它们是动态的,就像如果有 12 个问题,每个问题都会得到一组无线电场。我尝试了 FormField,它给了我我想要的,但所有问题的名称都是相同的,有没有更好的方法来做到这一点?
输出应该是这样的:
Question
Radiofield1 radioField1
Question
Radiofield2 radioField2
编辑: 我继续完成 HTML 字段,但这真的很有帮助。 我不太记得我做了什么,但这很接近我可以渲染字段但 id 不会改变我尝试将元组传递给
选项 但它为每个问题呈现动态单选字段,而不是为每个问题设置一组
Forms.py
class QuestionRadio(FlaskForm):
rad=RadioField("rad",choices=[(1,'Yes'),(2,'No')],id="opt")
class QuestionForm(FlaskForm):
options=FieldList(FormField(QuestionRadio),min_entries=1)
Views.py
#This is the question list
question=[(ques.id,ques.question) for ques in Questions.query.all()]
form=QuestionForm()
#I don't remember what I did after this
template.html
{% for key,val in question %}
<h4>key. val</h4>
{{form.options}}
{% endfor%}
wforms documentation 建议创建一个虚拟 class 并在您的视图中动态添加字段。
这是文档中的示例:
def my_view():
class F(MyBaseForm):
pass
F.username = StringField('username')
for name in iterate_some_model_dynamically():
setattr(F, name, StringField(name.title()))
form = F(request.POST, ...)
# do view stuff
在您的情况下,代码可能如下所示(未经测试):
def my_view():
class QuestionForm(Form):
pass
for q in Questions.query.all():
field = RadioField(q.question,choices=[(1,'Yes'),(2,'No')],id=q.id)
setattr(QuestionForm, q.id, field)
form = QuestionForm(request.POST, ...)
# do view stuff