2013-10-05 13 views
6

di Flask-WTF documentation afferma che:Flask-WTF FileField non imposta l'attributo di dati a un'istanza di Werkzeug FileStorage

Flask-WTF fornisce un FileField per gestire il caricamento dei file, si disegnerà automaticamente i dati da pallone .request.files se il modulo è pubblicato. L'attributo di dati di FileField sarà un'istanza di Werkzeug FileStorage.

Tuttavia, quando uso FileField, l'attributo data dopo la pubblicazione non è un oggetto FileStorage. Invece, è None (se definisco il mio modulo con enctype="multipart/form-data" come suggerito nella documentazione) o il nome file come stringa (se non definisco uno enctype).

Ecco il modello Jinja2 rilevanti:

{% from "_form.html" import render_field %} 
{% block body %} 
    <section class="page-width-container" id="offset-content"> 
    <div id="utility-box"> 
     <h1 class="utility-header">Settings</h1> 
     {{ message }} 
     <form action="/settings" method="post" enctype="multipart/form-data"> 
     {{ render_field(form.photo) }} 
     <input type="submit" class="form-action" value="Save" /> 
     </form> 
    </div> 
    </section> 
{% endblock %} 

La macro _form.html:

{% macro render_field(field) %} 
    <div class="field"> 
    {{ field.label }} 
    <span class="form-input">{{ field()|safe }}</span> 
    <div class="clear"></div> 
    {% if field.errors %} 
    <ul class="errors"> 
     {% for error in field.errors %} 
     <li>{{ error }}</li> 
     {% endfor %} 
    </ul> 
    {% endif %} 
    </div> 
{% endmacro %} 

Ed ecco il Python:

from flask import Blueprint, render_template, request 
from flask.ext.wtf import Form 
from flask.ext.wtf.file import FileField, FileRequired 

settings_bp = Blueprint('settings', __name__) 

class SettingsForm(Form): 
    photo = FileField('Photo', validators=[ 
    FileRequired('no file!'), 
    ]) 

@settings_bp.route('/settings', methods=['GET', 'POST']) 
def login(): 
    form = SettingsForm(request.form) 
    form.validate_on_submit() 
    print(type(form.photo.data)) 
    return render_template('settings.html', form=form, message=form.photo.data) 

Con il enctype attributo sul form elemento, il tipo stampato è NoneType; senza l'attributo enctype, il tipo di stampa è unicode. Né è l'oggetto FileStorage pubblicizzato dalla documentazione.

risposta

5

ho guardato nel codice sorgente (form.py) e capito il problema: il codice per sostituire l'attributo di dati di default con l'oggetto FileStorage non si attiva se il modulo viene inizializzato con una specifica formdata. Il formdata deve essere lasciato non specificato per il corretto funzionamento della funzionalità del file. Sostituzione questa linea:

form = SettingsForm(request.form) 

Con questa formazione:

form = SettingsForm() 

ha risolto il problema.

+0

Ciao Grazie per le tue risposte. Non riesco a trovare lo spot a cui fai riferimento nella fonte di form.py. Hai qualche dettaglio in più? –

Problemi correlati