简体   繁体   中英

Post method is not working in updateview django

I have a update view in django project. I need to override the post method because I am using multiple modelform. I have already override createview. And it is working fine.

views.py:

class EmployeeUpdateView(LoginRequiredMixin, UpdateView):
    """
    Update a created a employee
    """

    login_url = '/authentication/login/'
    template_name = 'employee/employee_update_form.html'
    form_class = EmployeeAddModelForm
    work_form_class = WorkExperienceForm
    education_form_class = EducationForm
    queryset = Employee.objects.all()
    #success_url = reverse_lazy('employee:employee-list')

    def get(self, request, *args, **kwargs):
        id_ = self.kwargs.get("id")
        employee_id = Employee.objects.get(id=id_)
        work_info = WorkExperience.objects.get(employee=employee_id)
        education_info = Education.objects.get(employee=employee_id)


        return render(request, self.template_name, {
                                                    'form': self.form_class(instance=employee_id),
                                                    'work_form': self.work_form_class(instance=work_info),
                                                    'education_form': self.education_form_class(instance=education_info)
                                                    }
                                                )

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        work_form = self.work_form_class(request.POST, prefix='work_form')
        education_form = self.education_form_class(request.POST, prefix='education_form')

        # Check form validation
        if form.is_valid() and work_form.is_valid() and education_form.is_valid():
            instance = form.save()
            work = work_form.save(commit=False)
            education = education_form.save(commit=False)
            work.employee = instance
            education.employee = instance
            work.update()
            education.update()

            return redirect('employee:employee-list')

        return render(request, self.template_name, {
                                                    'form': form,
                                                    'work_form': work_form,
                                                    'education_form': education_form
                                                    }
                                                )

When I press update button of my form, error is giving showwing "This field already exist". It means when i update the form, it is posting data as a new form not as a update form.

I think my post method is not working. Where is the error in my post method?

You can write your own view like this instead of sub classing the generic view. Since you are working with more than one model here so it will be easy for you to write your own view.

class EmployeeUpdateView(LoginRequiredMixin, ):

    .......

    def post(self, request, *args, **kwargs):
        id_ = self.kwargs.get("id")
        employee_id = Employee.objects.get(id=id_)
        work_info = WorkExperience.objects.get(employee=employee_id)
        education_info = Education.objects.get(employee=employee_id)

        form = self.form_class(request.POST, )
        work_form = self.work_form_class(request.POST, prefix='work_form', )
        education_form = self.education_form_class(request.POST, prefix='education_form',)

        # Check form validation
        if form.is_valid() and work_form.is_valid() and education_form.is_valid():
            instance = form.save()
            work = work_form.save(commit=False)
            education = education_form.save(commit=False)
            work.employee = instance
            education.employee = instance
            
            

            return redirect('employee:employee-list')

        return render(request, self.template_name, {
                                                    'form': form,
                                                    'work_form': work_form,
                                                    'education_form': education_form
                                                    }
                                                )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM