Python 同一页上具有相同无线字段的多个WTForms
好的,我已经在网上、文档和源代码中查看过了,我对这个问题没有任何了解。因此,我正在使用wtforms和bootstrap进行一个Flask项目,在这个项目中,我需要在一个页面上多次显示同一个表单。具体而言,本表格:Python 同一页上具有相同无线字段的多个WTForms,python,forms,twitter-bootstrap,flask,flask-wtforms,Python,Forms,Twitter Bootstrap,Flask,Flask Wtforms,好的,我已经在网上、文档和源代码中查看过了,我对这个问题没有任何了解。因此,我正在使用wtforms和bootstrap进行一个Flask项目,在这个项目中,我需要在一个页面上多次显示同一个表单。具体而言,本表格: class ProblemForm(Form): def __init__(self, formdata=None, obj=None, prefix='', title="", **kwargs): super(self.__class__, self)._
class ProblemForm(Form):
def __init__(self, formdata=None, obj=None, prefix='', title="", **kwargs):
super(self.__class__, self).__init__(formdata=None, obj=None, prefix='', **kwargs)
self.title = title
opts = RadioField("Possible Corrections")
alias_of = StringField("Alias of")
select_alias = BooleanField("select_alias")
user_input = StringField("New Entry")
select_uinput = BooleanField("select_uinput")
在控制器逻辑(见下文)中,我发现我可以创建一个ProblemForm实例数组,从会话中已有的数据中为每个“问题”设置选项
@blueprint.route("/clean/review/<int:start>-<int:end>", methods=["GET", "POST"])
@login_required
def cleaning(start, end):
prob_forms = []
for pif in xrange(start, end+1):
pf = ProblemForm(request.form, title=session["problems"][pif][0])
pf.opts.choices = [(pr, pr) for pr in session["problems"][pif][1]]+[('<null>', '<null>')]
prob_forms.append(pf)
if request.method == "POST":
pass
return render_template("main/cleaning.html", forms=prob_forms, buttons=ControlButtons(),
start=start, end=end)
@blueprint.route(“/clean/review/-”,方法=[“GET”,“POST”])
@需要登录
def清洁(开始、结束):
概率形式=[]
对于X范围内的pif(开始、结束+1):
pf=ProblemForm(request.form,title=session[“problems”][pif][0])
pf.opts.choices=[(pr,pr)用于会话中的pr[“问题”][pif][1]+[('','')]
问题表单附加(pf)
如果request.method==“POST”:
通过
返回render_模板(“main/cleaning.html”,forms=prob_forms,buttons=ControlButtons(),
开始=开始,结束=结束)
令人沮丧的是,这几乎奏效了。当表单发布时
request.form.lists()包含:[('select_uinput',[u'7']),('user_input',[u'',u'',u'',u'',u'',u'',u'',u'',u'',('select_alias',[u'2']),('alias_of',[u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u'',u''),('opts',,[u'天堂'),('next',,[u'next'])。我可以用这个;其中一个复选框在第7张表格中选中,另一个复选框在第2张表格中选中,在第二张表格中,用户在“别名”框中键入“Mike Rowe的肮脏工作”,等等
问题是名为“opts”的无线电场。它似乎只保存用户按下的最后一个按钮。有人知道为什么会这样,或者我应该在哪里寻找更多信息吗
以下是模板(如果有任何用途):
{% extends "layout.html" %}
{% block content %}
<form action="{{ url_for('main.cleaning', start=start, end=end) }}" method="POST" enctype="multipart/form-data">
{% for form in forms %}
{% set outloop = loop %}
<div class="well well-lg">
<h3><em>{{ form.title }}</em>?</h3>
<!-- Possible Master List entries -->
<div class="btn-group" id="opts_{{outloop.index}}" role="group" data-toggle="buttons" aria-label="...">
{% for opt in form.opts %}
{% if loop.first %}
<label class="btn btn-default active">
{% else %}
<label class="btn btn-default">
{% endif %}
{{ opt }} {{ opt.label.text }}
</label>
{% endfor %}
</div><br />
<!-- Alias input -->
<div class="row">
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-addon">
{{ form.select_alias(value=outloop.index) }}
</span>
<span class="input-group-addon" id="basic-addon2">Alias of</span>
{{ form.alias_of(class_="form-control") }}
</div><!-- /input-group -->
</div><!-- /.col-lg-6 -->
</div> <!-- /row -->
<!-- END Alias input -->
<!-- New Entry input -->
<div class="row">
<div class="col-lg-6">
<div class="input-group">
<span class="input-group-addon">
{{ form.select_uinput(value=outloop.index) }}
</span>
<span class="input-group-addon" id="basic-addon2">New Entry</span>
{{ form.user_input(placeholder=form.title, class_="form-control") }}
</div><!-- /input-group -->
</div><!-- /.col-lg-6 -->
</div> <!-- /row -->
</div>
<!-- END Alias input -->
{% endfor %}
{{ buttons.back() }} {{ buttons.next() }} {{ buttons.save() }}
</form>
{% endblock %}
{%extends“layout.html”%}
{%block content%}
{表格%中的表格为%}
{%set-outloop=loop%}
{{form.title}}?
{opt-in form.opts%}
{%if loop.first%}
{%else%}
{%endif%}
{{opt}}{{opt.label.text}
{%endfor%}
{{form.select_alias(value=outloop.index)}
别名
{{form.alias_of(class=“form control”)}
{form.select_uinput(value=outloop.index)}
新条目
{{form.user\u输入(占位符=form.title,class=“form control”)}
{%endfor%}
{{buttons.back()}}{{buttons.next()}}{{buttons.save()}}
{%endblock%}
选项1:给出每个表单实例:
选项2:或者,如果您使用一组FormFields生成一个封闭表单,WTForms可以为您生成带前缀的表单
class EnclosingForm(Form):
problems = FieldList(FormField(ProblemForm))
然后使用在循环中添加子窗体:
form = EnclosingForm(request.form)
for i, pif in enumerate(xrange(start, end+1)):
if len(form.problems.entries) <= i:
form.problems.append_entry({'title': session["problems"][pif][0]})
# etc
form=EnclosingForm(request.form)
对于i,枚举中的pif(xrange(开始,结束+1)):
如果len(form.problems.entries)我尝试了您建议的FieldList解决方案,则问题在于封闭的form.problems.data不包含用户在表单中输入的任何数据。我认为问题在于jinja2模板关闭了。我尝试了不同的修改,包括对问题使用{forms.problems()}}。然而,不管我怎么做,我仍然会得到一个字典列表,所有字典都包含False和None值,不管输入的是什么。啊!问题是:类ProblemForm(Form):def init_uuuuu(self,formdata=None,obj=None,prefix='',title=“”,**kwargs):super(self.uuuu类,self)。uuuuu init_uuuu(formdata=None,obj=None,prefix='',**kwargs)前缀,因此@Crast的方法添加的帮助被我草率的子类化搞砸了。这个故事的寓意是:小心分类,伙计们!
form = EnclosingForm(request.form)
for i, pif in enumerate(xrange(start, end+1)):
if len(form.problems.entries) <= i:
form.problems.append_entry({'title': session["problems"][pif][0]})
# etc