Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
记录对Django对象的项值更改_Django_Django Models_Django Forms - Fatal编程技术网

记录对Django对象的项值更改

记录对Django对象的项值更改,django,django-models,django-forms,Django,Django Models,Django Forms,目前,我正在考虑如何最好地在模型上实现更改日志记录,以便为对象提供某种形式的审计跟踪 我已经研究了django回归,在某种程度上它做了我需要它做的事情,但是我的需要比这更简单。我只想要能够记录哪些用户在什么时候更改了对象上的字段,以及提交更改之前字段的先前值的东西 一个简单的类来存储它如下: class AuditLogEntry(models.Model): user = ForeignKey(User, verbose_name=_(u"user"), related_name="a

目前,我正在考虑如何最好地在模型上实现更改日志记录,以便为对象提供某种形式的审计跟踪

我已经研究了django回归,在某种程度上它做了我需要它做的事情,但是我的需要比这更简单。我只想要能够记录哪些用户在什么时候更改了对象上的字段,以及提交更改之前字段的先前值的东西

一个简单的类来存储它如下:

class AuditLogEntry(models.Model):
    user = ForeignKey(User, verbose_name=_(u"user"), related_name="actions")
    obj = ForeignKey(ModelToLog, verbose_name=_(u"Model"), related_name="history")
    timestamp = DateTimeField(default=datetime.now)
    field = models.CharField(max_length=64)
    value = models.CharField(max_length=256)
目前,我只想在视图处理程序中添加一块代码,用如下内容更新模型:

form = ModelToLogForm(request.POST, instance=obj)
prev_data = dict()
for changed_field in form.changed_data:
    prev_data[changed_field] = form.instance.get_attribute(changed_field)
if form.is_valid():
    form.save()
    for changed_field in keys(prev_data):
        obj.history.create(user=request.user, obj=obj, field=changed_field, value=prev_data[changed_field]

从理论上讲,这应该是可行的,但我一直觉得这不是最好的方法。有没有更好的方法来做这样的事情?

您的方法有一个小问题。如果模型从代码中的其他地方更改,会发生什么情况?您不希望将此历史记录跟踪代码到处散播。调查信号,这是django管理历史解决方案使用的,正如zobbo所提到的