2017-03-13 5 views
6
내가 파일을 선택하고 단지 '제출'을 클릭하지 않으면, 나는 다음과 같은 오류가

: -변형합니다 파일 업로드는 잘못된 pstruct 내 오류 메시지를 무시합니다하지 않는 FieldStorage 예를

Invalid pstruct: {'upload': "b'' is not a FieldStorage instance"} 

이가 아니다 내가 deform demo site에 도착하면 비어있는 상태로두면 더 합리적인 'Required'오류 메시지가 나타납니다.

문제가 해결되지 않는 아래와 같이 내 자신의 유효성 검사기를 사용 : -

def validate_file(node, value, **kwargs): 
    if not value: 
     raise colander.Invalid(node, "Please select a file") 

class Schema(colander.MappingSchema): 
    excel_file = colander.SchemaNode(deform.FileData(), 
      widget=deform.widget.FileUploadWidget(tmpstore), 
      validator=validate_file) 

내가 오류가 발생 것을 볼 수 있지만, 전자 오류 일치하지 않는 form.validate에서 ValidationFailure입니다 e.render()의 출력을 그 자체. 관련 deform 소스 코드는 _FieldStorage 클래스가 cstructfile 속성이 있는지 확인하고 자신의 Invalid 예외를 발생시키는 'widget.py'에 있습니다.

다음은 유효성 검사 호출을 수행하는 함수입니다 (렌더링 된 페이지를 반환 함).

def generate_upload_form(request): 
    form = deform.Form(upload_schema, buttons=('submit',)) 
    if getattr(request, 'POST') and 'submit' in request.POST: 
     try: 
      value_dict = form.validate(request.POST.items()) 
     except deform.ValidationFailure as e: # Invalid form 
      form = e.render() 
     else: # Successfully validated, now do operation 
      upload_form_operation(request, value_dict) 
    if isinstance(form, deform.Form): 
     form = form.render() 
    return form 

어떻게이 deform 코드베이스를 원숭이 - 패치없이 내 자신의 오류 메시지가 표시되는 이유는 무엇입니까?

+0

을 실패 문자열로 파일 이름을 제출 참조 : https://www.bountysource.com/issues/43000745-fileuploadwidget-raises-error-if-file -is-not-provided –

답변

1

실제로 양식 데이터가 올바르게 제출 되었습니까? 이 오류는 일반적으로 변형이 오리 입력을 통해 제출 된 값을 비 직렬화하려고 시도 할 때 발생합니다.

HTML 양식에 추가 enctype 정의가 있는지 확인해야합니다. 이없이

enctype="multipart/form-data" 

양식은 다음

+0

이것은 잘 될지도 모르지만 (지금은 시스템에 액세스 할 수 없지만) form.render()에서 직접 html을 사용하여 html로 양식을 정의하지는 않습니다. 이것이 버그가 될 수 있습니까 (실제 문제라고 가정)? –

+0

이제 시스템 검사가 끝났으므로 형식 enctype은 실제로 multipart/form-data이므로 문제의 원인이 아닙니다. –

+0

@ NgOon-Ee 좀 더 많은 코드가 필요하다고 생각합니다. 제기 된 예외를 실제로 검증하고 처리하는 방법을 확인하는 것이 가능합니까? –