Django admin内联计算字段不会保存

时间:2014-01-10 14:30:12

标签: django field admin inline

我的内联中的一个字段需要计算。我覆盖了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中结束为零。我在错误的地方还是什么?

2 个答案:

答案 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'

当然需要条件来避免每次加载内联表单集时都节省成本。在保存记录的其余部分之后保存字段似乎很奇怪,但它确实有效。