Django AttributeError修改字段没有跟踪更改历史记录

问题描述:

我目前正在运行一个生产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预期...

现在我认为我最好的解决办法可能是让持有另一种模式隐藏/显示所有项目的信息并将其与项目模型分开。

想知道如果有人可能现在如何做到这一点。

感谢

可能不是最优雅的方式来做到这一点,但我最终作出一个独立的模型,用于存储显示/隐藏信息,并同步与该项目进行显示。

我这样做是为了显示/隐藏使用一个BooleanField和一个只读的OneToOne(Item)字段来同步我想要显示的项目。

工作得很好。