2014-11-20 159 views
0

我目前正在運行一個生產Django webapp,它使用SimpleHistory功能保存歷史項目信息。Django AttributeError修改字段沒有跟蹤更改歷史記錄

我有一個導航欄,顯示所有項目的所有當前版本點擊和查看他們單獨的頁面。話雖如此,我希望能夠通過更新項目管理頁面上的布爾字段來選擇要在導航欄中顯示/隱藏的項目。

所以,我修改了項目模型有一個字段做這樣的:

class Item(models.Model) 
field1 = models.CharField() 
field2 = models.CharField() 
... 

hide_item = models.BooleanField('Item hidden:', default=True) #don't want history on this field 

reason_for_change = models.CharField() 
changed_by = models.ForeignKey(User, null=True) 
accepted_by = models.ForeignKey(User, null=True) 
accepted_date = models.DateTimeField() 

history = HistoricalRecords() 

def __unicode__(self): 
    return self.name 
def save(self, *args, **kwargs): 
    super(Item, self).save(*args, **kwargs) 

@property 
def _history_user(self): 
    return self.changed_by 

@_history_user.setter 
    self.changed_by = value 

使得遷移後,該領域在管理頁面讓我高興的表現,但遺憾的是我沒能修改此領域沒有收到以下錯誤:

AttributeError: can't set attribute 
C:\Python27\lib\site-packages\simple_history\admin.py in save_model, line 151 
151.   obj._history_user = request.user 

我認爲這可能與以下事實,即項目領域的所有修改都需要使用SimpleHistory功能被跟蹤的事,但對於這個特殊的領域我不想跟蹤和存儲它的歷史年齡,我只想在管理頁面中隨意啓用和禁用。

我也注意到,如果我在webapp上創建一個Item的新實例,並在admin項目頁面上檢查hide_item的值,那麼在默認情況下它應該爲True時它是False。相反,如果我嘗試添加的管理頁面中的一個新項目實例,hide_item被默認設置爲True預期...

現在我認爲我最好的解決辦法可能是讓持有另一種模式隱藏/顯示所有項目的信息並將其與項目模型分開。

想知道如果有人可能現在如何做到這一點。

感謝

回答

0

可能不是最優雅的方式來做到這一點,但我最終作出一個獨立的模型,用於存儲顯示/隱藏信息,並同步與該項目進行顯示。

我這樣做是爲了顯示/隱藏使用一個BooleanField和一個只讀的OneToOne(Item)字段來同步我想要顯示的項目。

工作得很好。