2017-10-09 14 views
1

체크 박스가있는 파일 목록을 생성하고 싶습니다. FieldList를 사용하려고했지만 예상대로 작동하지 않습니다. 체크 박스에 할당 된 파일 이름 대신 FieldList 객체를 포함하는 변수의 이름을 가진 레이블이있는 체크 박스가 나타납니다. 그것을 고칠 방법이 있습니까?불투명도가있는 Flask WTForms 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 

답변

1

문서에 따르면, WTForms 'FieldList는 함께 사용할 수 없습니다 BooleanField :

참고 : HTML이 값을 보내는 방식의 제한으로 인해 FieldListBooleanField 또는 SubmitField 인스턴스를 묶을 수 없습니다.

(HTML 출력이 유효 나타납니다 있지만.), 당신은 당신이 append_entry의 첫 번째 매개 변수는 양식 입력 값이 아닌 라벨을 허용하기 때문에보고 기대하는지가 표시되지 않는 말했다. 대신

, 동적으로 폼 클래스를 만드는 것을 권 해드립니다 :

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