2017-10-09 16 views
1

チェックボックスを含むファイルのリストを生成したいと思います。私はFieldListを使用しようとしましたが、期待どおりに動作しません。チェックボックスにファイル名が割り当てられているのではなく、FieldListオブジェクトを含む変数の名前が付けられたラベルのチェックボックスが表示されます。それを修正する方法はありますか?Flask WTForms FieldList with BooleanField

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 

答えて

1

文書によると、WTForms' FieldListを一緒に使用すべきではありませんBooleanField

注:HTMLが値を送信する方法の制限により、FieldListBooleanFieldまたはSubmitFieldのインスタンスを囲むことはできません。あなたがappend_entryの最初のパラメータは、フォーム入力の値ではなく、そのラベルを受け入れるため見ることを期待しているものを見ていない、と述べた

(HTML出力が有効表示されていますが。)。代わりに

、私は動的にフォームクラスを作成することをお勧めしたい:

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

class FileListFormBase(FlaskForm): 
    submit = SubmitField('Submit') 

def file_list_form_builder(filenames): 
    class FileListForm(FileListFormBase): 
     pass 

    for (i, filename) in enumerate(filenames): 
     setattr(FileListForm, 'filename_%d' % i, BooleanField(label=filename)) 

    return FileListForm() 

@app.route('/') 
def listfiles(): 
    form = file_list_form_builder(filenames) 
    return render_template('index.html', form=form) 

注:ライブラリは、彼らがいる順序でフィールドをレンダリングするため、デフォルトのHTML表現は、上部にあるボタンを「送信」になります再定義される。 WTFormsはネイティブに注文をサポートしていないので、あまりエレガントではないにもかかわらず、これはあなたにとってより良い解決策です。

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

def file_list_form_builder(filenames): 
    class FileListForm(FlaskForm): 
     pass 

    for (i, filename) in enumerate(filenames): 
     setattr(FileListForm, 'filename_%d' % i, BooleanField(label=filename)) 

    setattr(FileListForm, 'submit', SubmitField('Submit')) 
    return FileListForm() 

@app.route('/') 
def listfiles(): 
    form = file_list_form_builder(filenames) 
    return render_template('index.html', form=form) 
+0

ありがとう。それはまさに私が探していたものです。 – przemekk

関連する問題