2014-01-10 72 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。 –