1

我正在尝试找到在我的 Django 项目中审核某些模型的最佳方法。提供一些上下文:该网站有帐户、项目和用户。其中任何一个都可以标记为活动或非活动。当项目的活动状态发生变化时,我想记录更改它的工作人员的日期和用户名。

我已经研究了解决这个审计问题的几种方法,但我希望 StackOverflow 社区可以为我指出一些更好的解决方案。Django 内置的管理界面历史有一个很好的格式,但还不够详细。它只告诉我一个项目已更改,但不告诉我它设置为什么状态:

在此处输入图像描述

如果我可以更改 Action 消息并仅记录某些字段的操作(而排除其他字段),我会喜欢使用 Django 的内置历史记录。

我下一次解决这个审计问题的尝试是研究插件。Django Reversion 似乎是最受欢迎的,但我不需要它的大部分功能,而且它确实面向版本控制而不是审计。我还发现了一个名为 AuditTrail 的插件,但它非常原始。

在尝试了这些可能性之后,我尝试推出自己的审计代码。我创建了一个新模型来记录活动。每次激活/停用帐户、项目或用户时都会写入一个条目。

class ActivityHistory(models.Model):
    """
    Stores the history of when accounts, projects, and users are active.
    This class uses generic relations in order to point to any model type.
    For more information see: https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations
    """
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    active = models.BooleanField(help_text="The target state (true if the item was activated, false if it was deactivated).")
    date = models.DateTimeField(help_text="The time at which the active state was changed.")
    actor = models.ForeignKey(User, help_text="The staff member who changed the active state of the account, project, or user in question.")
    class Meta:
        ordering = ['-date']

问题是我必须使用信号记录信息。在信号处理程序中,我无权访问 HTTPrequest对象。那么如何记录哪个工作人员更改了有问题的项目呢?

这个问题还有其他更容易实施的解决方案吗?

4

2 回答 2

0

与其从头开始自己实施,我建议您查看现有解决方案是否可以满足您的需求或几乎可以满足您的需求。分叉它,根据您的需要扩展它,如果您感觉良好,请分享回来!

我在最近的项目中使用了django-audit,并且对它非常满意(有一些调整)。我现在尝试的另一个不错的选择是django-audit-log

于 2012-07-27T22:28:49.567 回答
0

您可以重新实现 Django 的 ModelAdmin constructor_change_message 方法并在其中添加您的功能,这样您就可以利用现有功能。

然而,这没有记录,所以它可能会在未来的 Django 版本中改变

https://github.com/django/django/blob/master/django/contrib/admin/options.py#L665

于 2012-07-27T20:35:55.333 回答