request.FILES is empty though form tag contains multipart data encryption

Viewed 194

I am trying to upload a file to database from frontend HTML form. Here is the code:

createuser.html

<form method="POST" enctype="multipart/form-data" action="">
    <input type="file" name="myfile">
    <input type="submit">
</form>

views.py

@login_required(login_url='login')
def createuser(request):

    authority = Authority.objects.only('authority')
    designation = Authority.objects.only('designation')

    if request.method == 'POST':
        if request.POST:
            post = CustomUser()
            post.first_name = request.POST.get('first_name')
            post.middle_name = request.POST.get('middle_name')
            post.last_name = request.POST.get('last_name')
            post.emp_code = request.POST.get('emp_code')
            post.email = request.POST.get('email')
            passwrd = request.POST.get('password')
            post.password = make_password(passwrd)
            post.joining_date = request.POST.get('joining_date')
            # post.authority = request.POST.get('authority')
            # post.designation = Designation.objects.get(designation=request.POST.get('designation'))
                        
            post.language = request.POST.getlist('lang')
            post.address = request.POST.get('address')
            post.education = request.POST.get('education')
            post.blood_group = request.POST.get('blood_group')
            post.emergency_contact = request.POST.get('emergency_contact')
            post.relation = request.POST.get('relation')
            post.created_by = request.user
            
            myfile = request.FILES['myfile']  
            # generates multivalue dict error as multivalueDict is empty
            print(myfile)
           
            # fs = FileSystemStorage()
            # filename = fs.save(myfile.name, myfile)
            # uploaded_file_url = fs.url(filename)               
            # print(uploaded_file_url)
            post.save()
            s = '/usermanage/userdashboard'
            return redirect(s)

    userforminfo = CreateUser.objects.all()
    return render(request, 'usermanage/createuser.html', context={"userforminfo": userforminfo, "authority":authority, "designation":designation})

Output

<MultiValueDict: {}>

The output must be a file which I am selecting. Is there any way I could fix this?

1 Answers

I have faced a similar issue, here my issue is I directly passed the file data without FormData in the Rest API.

var formData = new FormData();
Array.from(files).forEach(f => formData.append('file', f))

using the above code, I passed the FormData to the POST API, my issue got resolved.

Related