'Formset not submitting uploaded picture?

I have a view to allow courses to created by users on my app, which am currently having a challenge uploading a course cover(pic) when users create a new course, when course is created all the fields of the course detail get submitted to the data base except the picture data, why is the picture not being submitted, can some one please help me. as this has been a challenge for me for the past week!

This is my view to create a new course!.

class OwnerMixin(object):
    def get_queryset(self):
        qs = super(OwnerMixin, self).get_queryset()
        return qs.filter(owner=self.request.user)


class OwnerEditMixin(object):
    def form_valid(self, form):
        form.instance.owner = self.request.user 
        return super(OwnerEditMixin, self).form_valid(form)


class OwnerCourseMixin(OwnerMixin):
    model = Course 
    fields = ['subject', 'title', 'slug','overview','pic']
    success_url = reverse_lazy('courses:manage_course_list')
    
    
class OwnerCourseEditMixin(OwnerCourseMixin):
    fields = ['subject', 'title','slug', 'overview','pic']
    success_url = reverse_lazy('courses:manage_course_list')
    template_name = 'manage/module/formset.html'
    
   


class ManageCourseListView(OwnerCourseMixin,ListView):
    template_name ='courses/course_list.html'


class CourseCreateView(OwnerCourseEditMixin,OwnerEditMixin,CreateView,):
    pass
    permission_required = 'courses.add_course'


class CourseModuleUpdateView(TemplateResponseMixin, View):
    template_name = 'manage/module/formset.html'
    course = None 
    
    def get_formset(self, data=None,):
        return ModuleFormSet(instance=self.course,data=data,)
    
    def get_form(self, data=None):
        return RequirementFormset(instance=self.course,data=data)
    
    def get_forms(self, data=None):
        return WhatYouWillLearnFormset(instance=self.course,data=data)
    
    def dispatch(self, request, pk):
        self.course = get_object_or_404(Course,id=pk,owner=request.user)
        return super(CourseModuleUpdateView, self).dispatch(request, pk)
    
    def get(self, request, *args, **kwargs):
        formset = self.get_formset()
        form = self.get_form()
        forms = self.get_forms()
        return self.render_to_response({'course':self.course,
                                        'formset':formset,'form':form,'forms':forms,})

    
    def post(self, request, *args, **kwargs):
        formset = self.get_formset(data=request.POST,)
        form = self.get_form(data=request.POST,)
        forms = self.get_forms(data=request.POST,)
       
        
        if formset.is_valid():
            formset.save()
        if form.is_valid():
            form.save()
        if forms.is_valid():
            forms.save()
            return redirect('courses:manage_course_list')
        
        return self.render_to_response({'course': self.course,
                                        'formset':formset,})

Here is my model, am using formset to create course and also

class Course(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL,\
         related_name='courses_created', on_delete=models.CASCADE)
    subject = models.ForeignKey(Subject,related_name='courses', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    pic = models.ImageField(upload_to="course_pictures", blank=True,null=True)
    slug = models.SlugField(max_length=200, unique=True,blank=True)
    overview = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    students = models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='courses_joined',blank=True)

    class Meta:
        ordering = ['-created']
    
    def __str__(self):
        return self.title

Here is my formset

class CourseForm(forms.ModelForm):
        class Meta:
                model = Course
                fields = ['pic']


ModuleFormSet = inlineformset_factory(Course,
                                      Module,
                                      fields=['title','description',],
                                       extra=2,
                                       can_delete=True)

RequirementFormset = inlineformset_factory(Course,
                                           Requirement, 
                                           fields=['requirements'],
                                           extra=4,can_delete=True)

WhatYouWillLearnFormset = inlineformset_factory(Course,
                                                WhatYouWillLearn,
                                                fields=['hightlights'],
                                                extra=4,can_delete=True)


Solution 1:[1]

I think the attribute enctype="multipart/form-data" is missing in the form tag in the template file.

<form method="post" enctype="multipart/form-data">
    ...
    ...
</form>

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Chandragupta Borkotoky