Как разрешить пустое поле загрузки файла, используя дуршлаг и деформировать с помощью пирамиды - PullRequest
0 голосов
/ 09 февраля 2020

Я использую дуршлаг и деформацию для создания полей загрузки файлов в моем банке данных. Код сохраняет имя файла в моей базе данных и сохраняет фактический файл в каталоге.

Если пользователь не загружает ни одного файла, я получаю эту ошибку

'AttributeError: у объекта' bytes 'нет атрибута' filename '

, но я хочу, чтобы пользователь был возможность оставить файл загрузки пустым. Это единственный способ решить эту проблему, используя некоторые операторы IF?

Вот мой код

  class Sample(colander.MappingSchema):
        setup_schema(None, spectra)
        spectraSchema = spectra.__colanderalchemy__
        format = colander.SchemaNode(
            colander.String(),
            default='',
            widget=deform.widget.SelectWidget(values=format_choices))
        sample_power_spectrum = colander.SchemaNode(
            deform.FileData(), widget=deform.widget.FileUploadWidget(tmpstore))
        background_power_spectrum = colander.SchemaNode(
            deform.FileData(), widget=deform.widget.FileUploadWidget(tmpstore))
        initial_result_spectrum = colander.SchemaNode(
            deform.FileData(), widget=deform.widget.FileUploadWidget(tmpstore))
        final_spectrum = colander.SchemaNode(
            deform.FileData(), widget=deform.widget.FileUploadWidget(tmpstore))
        setup_schema(None, post_processing_and_deposited_spectra)
        ppSchema = post_processing_and_deposited_spectra.__colanderalchemy__
        #upload = colander.SchemaNode(
            #deform.FileData(), widget=deform.widget.FileUploadWidget(tmpstore))

    form = Sample()

    form = deform.Form(form, buttons=('submit',))

    if 'submit' in request.POST:

        try:
            appstruct = form.validate(request.POST.items()) #call validate
            #upload file functionality
            controls = request.POST.items()

            pstruct = peppercorn.parse(controls)

            # get filenames
            myfile = pstruct['sample_power_spectrum']['upload']
            background = pstruct['background_power_spectrum']['upload']
            init = pstruct['initial_result_spectrum']['upload']
            final = pstruct['final_spectrum']['upload']
            #using pure path as coding on windows and putting on to a linux server
            #specify where to store the files
            permanent_store = os.path.join('ftirdb', 'static', 'data')
            #open file and add file from temp store to permanent
            permanent_file = open(
                os.path.join(permanent_store, myfile.filename.lstrip(os.sep)),
                'wb')
            shutil.copyfileobj(myfile.file, permanent_file)
            myfile.file.close()
            #close file and repeat for each item
            permanent_file.close()

...