2013-10-05 5 views
6

플라스크-WTF의에 documentation 상태 데이터 속성을 설정하지 않습니다플라스크-WTF 및 FileField는 것을 WERKZEUG FileStorage의 인스턴스

플라스크-WTF는 파일 업로드를 처리하는 당신에게 및 FileField을 제공하며, 자동으로 플라스크에서 데이터를 그릴 것입니다 양식이 게시되면 .request.files. FileField의 데이터 속성은 Werkzeug FileStorage의 인스턴스가됩니다. 내가 FileField를 사용할 때

그러나, 게시 후 data 속성은 FileStorage 개체가 아닙니다. 대신 None (문서에 제안 된대로 enctype="multipart/form-data"으로 양식을 정의한 경우) 또는 파일 이름을 문자열로 정의합니다 (enctype을 정의하지 않은 경우).

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

_form.html 매크로 : 다음 enctype

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) 

: 여기

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

그리고 파이썬은 여기

는 관련 Jinja2 템플릿입니다 속성의 form 요소이면 인쇄 유형은 NoneType입니다. enctype 특성이없는 경우 인쇄 유형은 unicode입니다. 문서에 의해 광고 된 FileStorage 개체도 아닙니다.

답변

5

소스 코드 (form.py)를 조사한 결과 양식이 formdata으로 초기화 된 경우 FileStorage 개체로 기본 데이터 특성을 바꾸는 코드가 활성화되지 않았습니다. 파일 기능을 사용하려면 formdata을 지정하지 않아야합니다. 이 라인으로

form = SettingsForm(request.form) 

:이 줄을 교체

form = SettingsForm() 

문제를 해결.

+0

안녕하세요. form.py의 소스에서 참조하는 지점을 찾을 수 없습니다. 좀 더 자세한 정보가 있습니까? –