我的内联中的一个字段需要计算。我覆盖了BaseInLineFormSet清理方法,可以在那里进行计算,显然在那里设置了字段的值,但它没有保存到数据库中,因此也没有显示。如果重要的话,字段默认为零,顺便说一下。这是一个硬编码版本:
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()
当我将值设置为clean时,我可以看到它在设置为save_formset时已被设置,但它仍然在DB中结束为零。我在错误的地方还是什么?
答案 0 :(得分: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
答案 1 :(得分:0)
似乎对此并不感兴趣,但为了完整起见,这就是我最终要做的事情。保存记录时,我试图保存场地的所有尝试都失败了。简单地将一些东西放入cleaning_data是行不通的。我试过覆盖clean,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'
当然需要条件来避免每次加载内联表单集时都节省成本。在保存记录的其余部分之后保存字段似乎很奇怪,但它确实有效。