MultiValueDictKeyError при загрузке нескольких файлов
Цель: Я хочу иметь несколько полей загрузки файлов из одной модели, в одном представлении и в одном шаблоне. Проблема в том, что я получаю эту ошибку: 'MultiValueDictKeyError' при отправке почтового запроса. Я искал https://stackoverflow.com/search?q=MultiValueDictKeyError+file+upload, но ни один из ответов не подходит - так как они охватывают только одно поле загрузки файла.
Некоторый контекст: Не все файлы обязательны для загрузки, некоторые могут быть пустыми. Пользователь просто загружает все файлы, которые могут быть использованы.
models.py
def user_directory_path(instance, filename):
return 'PDFs/{1}'.format(instance.user, filename)
class PDFUpload(models.Model):
class Meta:
verbose_name_plural = 'PDF Uploads'
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
pas = models.FileField(upload_to=user_directory_path, null=True, blank=True, validators=[FileExtensionValidator(['pdf'])])
add_pass = models.FileField(upload_to=user_directory_path, null=True, blank=True, validators=[FileExtensionValidator(['pdf'])])
gas_safe = models.FileField(upload_to=user_directory_path, null=True, blank=True, validators=[FileExtensionValidator(['pdf'])])
oftec = models.FileField(upload_to=user_directory_path, null=True, blank=True, validators=[FileExtensionValidator(['pdf'])])
hetas = models.FileField(upload_to=user_directory_path, null=True, blank=True, validators=[FileExtensionValidator(['pdf'])])
bba = models.FileField(upload_to=user_directory_path, null=True, blank=True, validators=[FileExtensionValidator(['pdf'])])
forms.py
class PDF(forms.ModelForm):
class Meta:
model = PDFUpload
fields = ['pas', 'add_pass', 'gas_safe', 'oftec', 'hetas', 'bba']
widgets = {
'pas': ClearableFileInput(attrs={'multiple': True}),
'add_pass': ClearableFileInput(attrs={'multiple': True}),
'gas_safe': ClearableFileInput(attrs={'multiple': True}),
'oftec': ClearableFileInput(attrs={'multiple': True}),
'hetas': ClearableFileInput(attrs={'multiple': True}),
'bba': ClearableFileInput(attrs={'multiple': True}),
}
labels = {
"pas": "PAS",
"add_pass": "Additional PAS (if applicable",
"gas_safe": "Gas Safe",
"oftec": "OFTEC",
"hetas": "HETAS",
"bba": "BBA",
}
views.py
@login_required
def upload(request):
if request.method == 'POST':
pdf_upload = PDF(request.POST, request.FILES)
error_message = "Only PDF files are allowed"
if pdf_upload.is_valid():
pdf_upload = PDFUpload(file=request.FILES['pas', 'add_pass', 'gas_safe', 'oftec', 'hetas', 'bba'], user=request.user)
pdf_upload.owner = request.user
pdf_upload.save()
request.user.save()
uploaded = True
return render(request, 'upload.html', {'uploaded': uploaded})
else:
pdf_upload = PDF()
return render(request, 'upload.html', {'pdf_upload': pdf_upload, 'error_message': error_message})
else:
pdf_upload = PDF()
return render(request, 'upload.html', {'pdf_upload': pdf_upload})
upload.html
{% if not uploaded %}
<form method = 'POST' enctype="multipart/form-data">
{% csrf_token %}
{{pdf_upload.as_p}}
<br/>
<p><button type = "submit" class = "waves-effect waves-light btn" style = "background-color: pink">Upload Documents</button></p>
</form>
{% endif %}
Изображение шаблона:
Не могли бы вы сообщить мне лучший способ достижения моей цели?