2014-01-10 42 views
0

我的内联字段中的一个需要计算。我覆盖了BaseInLineFormSet清理方法,并且可以在那里进行计算,并且显然在那里设置了字段的值,但是它不会保存到数据库中,因此也不会显示。该字段默认为零,顺便说一句,以防万一。这里有一个硬编码的版本:Django admin内联计算字段不会保存

class EmployeeAssignmentInLineFormSet(BaseInlineFormSet): 
    def clean(self): 
     super(EmployeeAssignmentInLineFormSet, self).clean() 
     self.cleaned_data[0]['cost'] = 5000 

我也试过在的ModelAdmin覆盖save_formset - 同样的结果:

def save_formset(self, request, form, formset, change): 
    formset.cleaned_data[0]['cost'] = 5000 
    formset.save() 

当我设置的值只是干净,我可以看到它已经被设置时,它得到save_formset,但它仍然最终在数据库中为零。我在错误的地方或什么?

回答

0

似乎并没有在这么多的兴趣,但为了完整起见,这是我落得这样做。当记录保存失败时,我试图保存字段的所有gazillion尝试都失败了。简单地把一些东西放到clean_data中是行不通的。我尝试覆盖干净,save_model,save_related,save_formset - 没有喜悦。所以,现在我在内嵌选项:

readonly_fields = ('get_cost',) 
fields = ('project', 'start_date', 'end_date', 'effort', 'role', 'get_cost') 

def get_cost(self, obj): 
    if obj.effort and obj.cost == 0.0: 
     obj.cost = obj.employee._calculate_cost(obj.effort) 
     obj.save() 
    return obj.cost 
get_cost.short_description = 'Cost' 

需要的条件当然是要避免每次在线表单集加载时间节约了成本。似乎奇数后保存其余的记录已保存,但它的工作原理。

0

我不认为一个ModelFormSet有cleaned_data属性一样,
https://github.com/django/django/blob/master/django/forms/models.py#L623

我不知道为什么你没有得到从您在这种情况下上面的代码中的异常,但在我看来就像你应该尝试,而不是:

def clean(self): 
    super(EmployeeAssignmentInLineFormSet, self).clean() 
    self.forms[0].cleaned_data['cost'] = 5000 
+0

显然是同样的事情。一些代码: –

+0

嗯,我不知道我以前的评论发生了什么,所以只是不理会它,我会再试一次。如果我在我的线上放置断点(self.cleaned_data [0] ['cost'] = 5000),我会看到该值和self.forms [0] .cleaned_data ['cost']处的值均为零。然后我再次检查这些值,两者都是5000.所以他们都指向相同的东西,然后自然我仍然在DB中得到0。 –