1

When i submit form i get an AttributeError: 'NoneType' object has no attribute 'user' please help meto fix this problem

My forms.py

class resume_upload(forms.ModelForm):
    cv = forms.FileField(required = True)
    job_title = forms.CharField(required = True)

    def save(self, commit=False):
       cvs = super(resume_upload, self).save(commit=False)
       cvs.cv = self.cleaned_data['cv']
       cvs.job_title = self.cleaned_data['job_title']

       if commit:
           cvs.save()


    class Meta:
        model = Cv
        fields = ('cv', 'job_title',)

My models.py

class Cv(models.Model):
     user = models.OneToOneField(User, on_delete=models.CASCADE)
     cv = models.FileField(upload_to='cvs', default='', validators=[validate_file_extension])
     job_title = models.CharField(max_length=100, default='')

    def __str__(self):
        return self.job_title

and my views.py

def upload_resume(request):
    if request.method == 'POST':
        form = resume_upload(request.POST, request.FILES)
        if form.is_valid():
            cv_form = form.save() # commit is False in this case.
            cv_form.user = request.user
            form.save(commit=True)
            return redirect('/')
        else:
            messages.error(request,"Oops! That didn't work. Please try again")
    else:
        form = resume_upload()
    return render(request, 'upload_resume.html',{'form':form,})
Chams Agouni
  • 364
  • 1
  • 12

2 Answers2

3

When you overwrite the save() method in your ModelForm resume_upload(forms.ModelForm) you need to return the object:

def save(self, commit=False):
    cvs = super(resume_upload, self).save(commit=False)
    cvs.cv = self.cleaned_data['cv']
    cvs.job_title = self.cleaned_data['job_title']

    if commit:
        cvs.save()

    return cvs
Cyrlop
  • 1,894
  • 1
  • 17
  • 31
1

You are hiding your user field when you setting up fields that way, so they cant find attribute user in your form when you trying to pass request.user to it

class Meta:
    model = Cv
    fields = ('cv', 'job_title', 'user')
Diego Vinícius
  • 2,125
  • 1
  • 12
  • 23