2015-11-28 67 views
2

我要上傳單個文件用下面的漏勺模式:科蘭德變形的文件上傳控件

import colander 
import deform 
from deform.interfaces import FileUploadTempStore 

@view_config(route_name='upload', 
      renderer='templates/upload.pt', 
      permission='view') 
def upload(self): 
    tmpstore = FileUploadTempStore() 
    class Schema(colander.Schema): 
     name = colander.SchemaNode(
      deform.FileData(), 
      widget=deform.widget.FileUploadWidget(tmpstore), 
      title='Upload' 
     ) 
    def on_validated(request, captured): 
     pass 
    schema = Schema() 
    form = deform.Form(schema, buttons=('upload',), formid='form') 
    html = [] 
    captured = None 
    if 'upload' in self.request.POST: 
     try: 
      controls = self.request.POST.items() 
      captured = form.validate(controls) 
      response = on_validated(self.request, captured) 
      if response is not None: 
       return response 
     except deform.ValidationFailure as e: 
      html.append(e.render()) 
    else: 
     html.append(form.render()) 
    html = ''.join(html) 
    return { 
     'form': html, 
    } 

視圖工作得很好,我可以瀏覽並選擇一個文件。然而,當我按下「上傳」按鈕,我得到的錯誤: TypeError: 'NoneType' object does not support item assignment

controls定義,但form.validate()的問題。它指的是deform/widget.py線1674:

self.tmpstore[uid]['preview_url'] = preview_url 

回答

1

通過(從deformdemo/init.py)限定tmpstore不同修正:

class MemoryTmpStore(dict): 
     """ Instances of this class implement the 
     :class:`deform.interfaces.FileUploadTempStore` interface""" 

     def preview_url(self, uid): 
      return None 

    tmpstore = MemoryTmpStore()