Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.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 带布尔字段的表单字段列表_Python_Python 3.x_Flask_Flask Wtforms - Fatal编程技术网

Python 带布尔字段的表单字段列表

Python 带布尔字段的表单字段列表,python,python-3.x,flask,flask-wtforms,Python,Python 3.x,Flask,Flask Wtforms,我想生成带有复选框的文件列表。我尝试过使用FieldList,但它没有达到我的预期效果。我得到的不是带有指定文件名的复选框,而是带有以包含FieldList对象的变量命名的标签的复选框。有没有办法解决这个问题 app.py: from flask import Flask, render_template from flask_bootstrap import Bootstrap from flask_wtf import FlaskForm from wtforms import Boolea

我想生成带有复选框的文件列表。我尝试过使用FieldList,但它没有达到我的预期效果。我得到的不是带有指定文件名的复选框,而是带有以包含FieldList对象的变量命名的标签的复选框。有没有办法解决这个问题

app.py:

from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_wtf import FlaskForm
from wtforms import BooleanField, FieldList, SubmitField

app = Flask(__name__)
app.config['SECRET_KEY'] = 'development'
Bootstrap(app)

filenames = ['1.jpg', '2.jpg', '3.jpg', '4.jpg']


class FileListForm(FlaskForm):
    filename = FieldList(BooleanField(), 'Files')
    submit = SubmitField('Submit')


@app.route('/')
def listfiles():
    form = FileListForm()
    for filename in filenames:
        form.filename.append_entry(filename)
    return render_template('index.html',
                           form=form)


if __name__ == '__main__':
    app.run(debug=True, port=5001)
模板/index.html

{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
套餐:

click==6.7
dominate==2.3.1
Flask==0.12.2
Flask-Bootstrap==3.3.7.1
Flask-WTF==0.14.2
itsdangerous==0.24
Jinja2==2.9.6
MarkupSafe==1.0
visitor==0.1.3
Werkzeug==0.12.2
WTForms==2.1

根据文件规定,WTForms不应与以下内容一起使用:

注意:由于HTML发送值的方式有限制,
FieldList
不能包含
BooleanField
SubmitField
实例

(即使HTML输出看起来有效。)也就是说,您没有看到期望看到的内容,因为
append\u entry
的第一个参数接受表单输入的值,而不是它的标签

相反,我建议动态创建表单类:

filename=['1.jpg','2.jpg','3.jpg','4.jpg']
类FileListFormBase(FlaskForm):
submit=SubmitField('submit')
def文件列表表单生成器(文件名):
类FileListForm(FileListFormBase):
通过
对于枚举(文件名)中的(i,文件名):
setattr(FileListForm,'filename_u%d'%i,BooleanField(label=filename))
返回FileListForm()
@应用程序路径(“/”)
def listfiles():
表单=文件\列表\表单\生成器(文件名)
返回呈现模板('index.html',form=form)
注意:默认的HTML表示将在顶部有“提交”按钮,因为库按照定义的顺序呈现字段。WTForms本身不支持订购,因此这可能是一个更好的解决方案,尽管它不那么优雅:

filename=['1.jpg','2.jpg','3.jpg','4.jpg']
def文件列表表单生成器(文件名):
类文件列表表单(烧瓶表单):
通过
对于枚举(文件名)中的(i,文件名):
setattr(FileListForm,'filename_u%d'%i,BooleanField(label=filename))
setattr(FileListForm,'submit',SubmitField('submit'))
返回FileListForm()
@应用程序路径(“/”)
def listfiles():
表单=文件\列表\表单\生成器(文件名)
返回呈现模板('index.html',form=form)

以防这对将来的任何人都有帮助。这就是我如何实现这个解决方案的jinja部分

我创建了一个要发送到模板的变量名列表。 在我的例子中,我需要根据计数动态创建几个字段。 这些名称需要与您在构建表单时创建的名称相匹配,例如,在针对上述给定问题的选定解决方案中

variable_names_list = []
for i in range(1, count+1):
    variable_names_list.append([f'var1_name_{i}',f'var2_name_{i}',f'var3_name_{i}',f'var4_name_{i}'])
在render template语句中将此发送到模板 然后使用以下jinja来显示表单项

                    <div class="row">
                        <table class="table table-bordered">
                            <tbody>
                                {{ form.csrf_token }}
                                {% for variable_names in variable_names_list %}
                                <tr>
                                    {% for variable in variable_names %} 
                                        <td>
                                            {{ form[variable] }}
                                        </td>
                                    {% endfor %}
                                </tr>

                                {% endfor %}
                            </tbody>

                        </table>
                    </div>
我花了一段时间才弄明白,这就是如何单独访问表单项

希望这对将来的人有所帮助


干杯

谢谢。这正是我想要的。有人可以修改jinja代码,以便在html模板中显示名为
filename_I
的复选框吗???@RainerGlüge嘿,你有没有找到这方面的jinja代码?这个解决方案很棒。我只是不知道如何在Jinja中单独渲染字段。在我的情况下,一次渲染整个表单并不能真正起作用。有人知道怎么做吗?即使我将所有字段名的列表发送到模板,我仍然不确定如何正确使用它们。{%for var_list%}{{form.{{var_name}}}{%endfor%}我不认为您可以将双括号标记嵌套在其中,但我想我会尝试返回报告。我向预检查复选框传递了额外信息:
{{ form[variable] }}