2013-04-18 12 views
2

Я новичок в django. Может ли кто-нибудь помочь мне с этим кодом. Я пытаюсь вычислить продолжительность между 2 DateField и затем сохранить.Django form_valid не работает

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()) 
+0

В чем проблема? – Rohan

+0

Я не могу вычислить и сохранить total_leave. Это не сохраняет ничего – user1708597

+0

Теперь получение ошибки Исключение Значение: объект «NoneType» не имеет атрибута «total_leave» – user1708597

ответ

6

Есть пара вопросов

  1. Вы должны использовать form.instance вместо self.object
  2. вызова метода супер

Так обновить свой код, как:

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) 

См. Документы Form handling with class-based views

+0

Ошибка получения: Исключительное значение: объект «EmployeeCreate» не имеет атрибута «instance» – user1708597

+1

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

+0

его теперь работает thanx man – user1708597

3

Из-за CreateView Прежде всего, вам нужно сохранить форму, чтобы получить объект.

Не сохраняйте объект в базе данных для дальнейшей настройки (commit=False).

Затем измените объект в соответствии с вашими требованиями. Наконец, сохраняйте объект в базе данных и возвращайте ответ перенаправления.

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()) 

Также обратите внимание на основной form_valid реализации в ModelFormMixin:

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

Тогда super(ModelFormMixin, self).form_valid(form) прикован к FormMixin:

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

Таким образом, мы объединили оба шага в одном методе.

Смежные вопросы