2013-04-18 2 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

있습니다 당신은 그래서 코드를 업데이트하는 대신 self.object

  • 전화 슈퍼 방법을
  • form.instance를 사용해야합니다

    1. 문제의 몇 등 :

      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'객체에 '인스턴스'속성이 없습니다. – user1708597

    +1

    def form_valid (self, 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

    현재 작동하는 고비 남자 – 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()) 
    

    또한 ModelFormMixin에 기본 form_valid 구현을 보면 :

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

    그래서 우리는 하나의 방법에서 두 단계를 결합했다.

    관련 문제