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:

Template view

Could you let me know the best way to achieve my goal?

Back to Top