2

我是 django 的新手。任何人都可以帮助我使用此代码。我正在尝试计算 2 DateField 之间的持续时间然后保存。

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

2 回答 2

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)

参考文档使用基于类的视图处理表单

于 2013-04-18T05:05:04.770 回答
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())

因此,我们将这两个步骤结合在一种方法中。

于 2013-04-18T07:06:47.657 回答