2015-11-28 11 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

Fixed определяя tmpstore по-разному (от deformdemo/init.py):

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

     def preview_url(self, uid): 
      return None 

    tmpstore = MemoryTmpStore()