Форма django с несколькими полями файлов

Как вы обрабатываете несколько полей файла в Django. Например, если у меня было только одно поле формы, я передал бы request.FILES ['file'] функции обработки. Но каков путь, когда есть больше файлов?

Ответы

Ответ 1

Я опаздываю на вечеринку, но я пытался понять это на некоторое время и, наконец, получить решение. Посмотрите на код, используемый здесь: https://code.djangoproject.com/ticket/12446

Вы можете получить множественные значения с помощью getlist. Если моя форма HTML:

<form enctype="multipart/form-data" action="" method="post">
<input type="file" name="myfiles" multiple>
<input type="submit" name="upload" value="Upload">
</form>

Мой код django для его обработки будет выглядеть так:

for afile in request.FILES.getlist('myfiles'):
    # do something with afile

Написание поля формы/виджета для правильного управления этим является моим следующим шагом. Я по-прежнему довольно новичок в использовании Django, поэтому я учусь, когда я иду.

Ответ 2

request.FILES.get('filename', None) отвечает на существование поля с именем формы следующим образом:

<input type="file" name="filename"></input>

Если у вас было два таких поля:

<input type="file" name="file1"></input>
<input type="file" name="file2"></input>

Затем request.FILES.get('file1', None) и request.FILES.get('file2', None) должны предоставить вам эти файлы соответственно.

Причиной этого является многопользовательский мим. Три части (данные формы, файл1, файл2) должны быть загружены, а Django UploadFileHandler разделяет это на request.POST и request.FILES соответственно.

Ответ 3

Вот хорошая ссылка для этого ответа: https://github.com/Chive/django-multiupload. Однако, поскольку я не использовал ModelForm, мне пришлось внести несколько изменений. В виду, что я написал ниже код и сохраненные файлы на диск:

for each in form.cleaned_data['attachments']:
    handle_uploaded_file(each)

def uploadMyWork(request):
    from .forms import UploadFileForm, handle_uploaded_file
    print 'in uploadMyWork'

    if request.method == 'GET':
        print 'in uploadMyWork : GET'
        form = UploadFileForm()
    else:
        form = UploadFileForm(request.POST, request.FILES)
        print 'in uploadMyWork : POST'
        #for each in form.cleaned_data['attachments']:
        #    handle_uploaded_file(each)
        #return render(request, 'stitchme/uploadMyWork.html', {'msg': "file uploaded successfully"})

        if form.is_valid():
             print 'inside form valid'
             for each in form.cleaned_data['attachments']:
                 handle_uploaded_file(each)
             return render(request, 'stitchme/uploadMyWork.html', {'msg': "file uploaded successfully"})

    print 'returning to uploadmywork'
    return render(request, 'stitchme/uploadMyWork.html', {'form': form, 'msg':'hi'})

Ответ 4

class XmlForm(forms.Form):
    files = forms.FileField(
        required=True, allow_empty_file=False, widget=forms.FileInput(
            attrs={
                "accept":"application/xml",
                "multiple":""
            }))