MultiValueDictKeyError for multiple file uploads
Goal: I'm looking to have multiple file upload fields from one model, under one view and in one template. The issue is that I get this error: 'MultiValueDictKeyError' when submitting the post request. I have searched https://stackoverflow.com/search?q=MultiValueDictKeyError+file+upload but none of the responses appear to be applicable - as they only cover one field file uploads.
Some context: Not all file uploads are required and some can be blank. The user just uploads whatever files are applicable.
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 %}
Image of template:
Could you let me know the best way to achieve my goal?
