2013-10-05 5 views
6

Flask-WTF documentation besagt, dass:Flask-WTF Filefield keine Daten Attribut auf eine Instanz Werkzeug Filestorage gesetzt

Flask-WTF Sie ein Filefield bietet das Hochladen von Dateien zu verarbeiten, wird es automatisch Daten aus Kolben ziehen .request.files, wenn das Formular veröffentlicht wird. Das Datenattribut von FileField ist eine Instanz von Werkzeug FileStorage.

Allerdings, wenn ich FileField verwenden, das data Attribut nach Veröffentlichung ist kein FileStorage Objekt. Stattdessen ist es entweder None (wenn ich mein Formular mit enctype="multipart/form-data" definiere wie in der Dokumentation vorgeschlagen) oder der Dateiname als String (wenn ich kein enctype definiere).

Hier ist die relevante Jinja2 Vorlage:

{% 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 %} 

Das _form.html Makro:

{% 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 %} 

Und hier ist der 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) 

Mit den enctype Attribut auf dem form Element, der gedruckte Typ ist NoneType; Ohne das Attribut enctype ist der gedruckte Typ unicode. Weder ist das FileStorage Objekt durch die Dokumentation beworben.

Antwort

5

Ich sah in den Quellcode (form.py) und das Problem herausgefunden: der Code die Standarddaten Attribut mit dem FileStorage Objekt zu ersetzen, ist nicht aktiviert, wenn die Form mit einer bestimmten formdata initialisiert wird. Die muss nicht angegeben werden, damit die Dateifunktionalität funktioniert. Ersetzen Sie diese Zeile:

form = SettingsForm(request.form) 

Mit dieser Zeile:

form = SettingsForm() 

das Problem behoben.

+0

Hallo Danke für Ihre Antworten. Ich kann den Ort, auf den Sie verweisen, nicht in der Quelle von form.py finden. Hast du ein bisschen mehr Details? –