Форма 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":""
}))