user1708597
user1708597

Reputation: 99

Django form_valid is not working

I am new to django . Can anyone help me with this code. I am trying to calculate duration between 2 DateField then save.

class EmployeeCreate(CreateView):
    model = Employee
    form_class = EmployeeCreateForm
    success_url = "/employee-list/"

    def form_valid(self, form):
        self.object.total_leave = (self.object.to_date - self.object.from_date).days +1
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

Upvotes: 2

Views: 9688

Answers (2)

Rohan
Rohan

Reputation: 53316

There are couple of issues

  1. You should use form.instance instead of self.object
  2. Call super method

So update your code as:

def form_valid(self, form):
    form.instance.total_leave = (self.instance.to_date - self.instance.from_date).days +1
    form.instance.save()
    return super(EmployeeCreate, self).form_valid(form)

Refer docs Form handling with class-based views

Upvotes: 6

Eduard Iskandarov
Eduard Iskandarov

Reputation: 862

Because of CreateView first of all you have to save form to get an object.

Do not persisting object to database for futher customization(commit=False).

Then change object to fit your requirements. Finally persist object in database and return redirect response.

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.total_leave = (self.object.to_date - self.object.from_date).days + 1
    self.object.save()
    return HttpResponseRedirect(self.get_success_url())

Also look at basic form_valid implementation in ModelFormMixin:

def form_valid(self, form):
    self.object = form.save()
    return super(ModelFormMixin, self).form_valid(form)

Then super(ModelFormMixin, self).form_valid(form) chained to FormMixin:

def form_valid(self, form):
    return HttpResponseRedirect(self.get_success_url())

So we combined both steps in one method.

Upvotes: 3

Related Questions