Django AttributeError修改字段而不跟踪更改历史记录

时间:2014-11-20 21:42:26

标签: django model field admin attributeerror

我目前正在运行一个生产Django webapp,它使用SimpleHistory功能保存历史项目信息。

我有一个导航栏,显示要点击的所有项目的所有当前版本并查看其各自的页面。话虽这么说,我希望能够通过更新项目管理页面上的布尔字段来选择要在导航栏中显示/隐藏的项目。

所以,我修改了项目模型,以便有一个字段来执行此操作:

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。相反,如果我尝试在管理页面中添加一个新的Item实例,默认情况下hide_item会按预期设置为True ...

现在我认为我最好的解决方案可能是制作另一个模型,其中包含所有项目的隐藏/显示信息,并将其与项目模型分开。

想知道现在是否有人可以如何实现这一目标。

由于

1 个答案:

答案 0 :(得分:0)

可能不是最优雅的方式,但我最终制作了一个单独的模型,用于存储显示/隐藏信息并与要显示的项目同步。

我使用BooleanField进行显示/隐藏,并使用readonly OneToOne(Item)字段与我想要显示的项目同步。

工作得很好。