Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 同一页上具有相同无线字段的多个WTForms_Python_Forms_Twitter Bootstrap_Flask_Flask Wtforms - Fatal编程技术网

Python 同一页上具有相同无线字段的多个WTForms

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)._

好的,我已经在网上、文档和源代码中查看过了,我对这个问题没有任何了解。因此,我正在使用wtforms和bootstrap进行一个Flask项目,在这个项目中,我需要在一个页面上多次显示同一个表单。具体而言,本表格:

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