Reputation: 99
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
Reputation: 53316
There are couple of issues
form.instance
instead of self.object
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
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