lundi 2 avril 2018

Multiple model formset factory in single view

I have multiple model formset in a single view.This is used for editing the existing data of profile and to add new data by user. When user try to edit and save the data, data is not being saved in database. What am i doing wrong?

views.py

def profile_edit(request,username):
    profile_edit = get_object_or_404(User,username=username)
    userprofile  = get_object_or_404(UserProfile,user__username=username)
    UserDegreeFormset = modelformset_factory(Degree,form = EditForm2,extra=1,validate_max=True,can_delete=True)
    degree = Degree.objects.filter(user__username=username)
    UserCertificateFormset = modelformset_factory(Certificate,form=EditForm4,extra=1,validate_max=True,can_delete=True)
    certificate = Certificate.objects.filter(user__username=username)
    UserSocialFormset = modelformset_factory(SocialMedia,form=EditForm5,extra=1,validate_max=True,can_delete=True)
    sociallink = SocialMedia.objects.filter(user__username=username)
    if request.user == profile_edit and request.user.is_authenticated:
        if request.method == "POST":
            form = EditForm(request.POST or None,instance=profile_edit)
            form1 = EditForm1(request.POST or None,instance=userprofile)
            form2 = UserDegreeFormset(request.POST or None,queryset= degree)
            form4 = UserCertificateFormset(request.POST or None,queryset=certificate)
            form5 = UserSocialFormset(request.POST or None, queryset=sociallink)
            if form.is_valid() and form1.is_valid() and form2.is_valid() and form4.is_valid() and form5.is_valid():
                form.save()
                form1.save()
                degs = form2.save(commit=False)
                for obj in form2.deleted_objects:
                    obj.delete()
                for deg in degs:
                    deg.user = profile_edit
                    deg.save()
                certs = form4.save(commit=False)
                for obj in form4.deleted_objects:
                    obj.delete()
                for cert in certs:
                    cert.user = profile_edit
                    cert.save()
                links = form5.save(commit=False)
                for obj in form5.deleted_objects:
                    obj.delete()
                for link in links:
                    link.user = profile_edit
                    link.save()
                return redirect('profile_edit',username=username)

        else:
            form = EditForm(instance=profile_edit)
            form1 = EditForm1(instance=userprofile)
            form2 = UserDegreeFormset(queryset=degree)
            form4 = UserCertificateFormset(queryset=certificate)
            form5 = UserSocialFormset(queryset=sociallink)
        context = {
            'form':form,
            'form1':form1,
            'form2':form2,
            'form4':form4,
            'form5':form5,
        }
        return render(request,'userprofile/profile_edit.html', context)
    else:
        raise PermissionDenied

forms.py

class EditForm(forms.ModelForm):
    email = forms.EmailField(label='Email Address',disabled=True)
    class Meta:
        model = User
        fields = ('username','email','first_name','last_name',)


class EditForm1(forms.ModelForm):
    date_of_birth = forms.DateField(widget=forms.SelectDateWidget)
    class Meta:
        model = UserProfile
        fields = ('date_of_birth','phone_no','overall_rating','preferred_language',)

class EditForm2(forms.ModelForm):
    class Meta:
        model = Degree
        exclude = ("user",)


class EditForm4(forms.ModelForm):
    class Meta:
        model = Certificate
        fields = ('title','institution_name',)

class EditForm5(forms.ModelForm):
    class Meta:
        model = SocialMedia
        fields = ('website_name','website_link',)

PS1:- When I'm using only one model formset , then It is working all good.

PS2:- There is no error being shown.




Aucun commentaire:

Enregistrer un commentaire