2017-10-09 5 views
1

Je voudrais générer une liste de fichiers avec des cases à cocher. J'ai essayé d'utiliser FieldList mais cela ne fonctionne pas comme prévu. Au lieu de checkbox avec le nom de fichier assigné je reçois la case à cocher avec le label nommé après la variable contenant l'objet FieldList. Y a-t-il un moyen de le réparer?Flask WTForms FieldList avec 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) 

modèles/index.html

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

paquets:

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 

Répondre

1

Selon la documentation, WTForms' FieldList ne doit pas être utilisé avec BooleanField:

Remarque: En raison d'une limitation dans la façon dont le code HTML envoie des valeurs, FieldList ne peut pas inclure les instances BooleanField ou SubmitField.

(Même si la sortie HTML apparaît valide.) Cela dit, vous ne voyez pas ce que vous vous attendez à voir parce que premier paramètre de append_entry accepte la valeur de l'entrée de la forme, et non son étiquette.

Au lieu de cela, je vous recommande la création de la classe de formulaire dynamique:

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) 

Note: La représentation HTML par défaut aura le bouton « Soumettre » au sommet, puisque la bibliothèque rend les champs dans l'ordre » re défini. WTForms ne supporte pas nativement la commande, donc ceci peut être une meilleure solution pour vous même si c'est moins élégant:

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

Merci. C'est exactement ce que je cherchais. – przemekk