【问题标题】:Django admin inline calculated field won't saveDjango admin内联计算字段不会保存
【发布时间】:2014-01-10 14:30:11
【问题描述】:

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

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 中仍然为零。我是在错误的地方还是什么?

【问题讨论】:

    标签: django field admin inline


    【解决方案1】:

    我认为 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
    

    【讨论】:

    • 好吧,我不知道我之前的评论中发生了什么,所以请忽略它,我会再试一次。如果我在行 (self.cleaned_data[0]['cost'] = 5000) 处设置断点,我会看到该值和 self.forms[0].cleaned_data['cost'] 处的值都为零。然后我再次检查值,两者都是 5000。所以它们都指的是同一个东西,然后自然我仍然在数据库中得到 0。
    【解决方案2】:

    似乎对此没有太大兴趣,但为了完整起见,这就是我最终要做的。保存记录时,我试图保存该字段的所有尝试都失败了。简单地将一些东西放入cleaned_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'
    

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

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 2022-01-24
      • 2014-12-28
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多