【问题标题】:Django - Show history in admin working but only when actions take place in adminDjango - 在管理员工作中显示历史记录,但仅在管理员中发生操作时显示
【发布时间】:2021-05-04 09:19:00
【问题描述】:

在 Django admin 中,当您查看记录时,有一个名为“history”的按钮。当您单击此按钮时,它会告诉您记录的创建时间和创建者,以及每次更改字段的时间和更改者。我觉得这非常有用。但是,我注意到这些仅显示在管理页面上执行的操作。因此,当我通过视图更改记录时,该历史记录中不会显示。有没有一种简单的方法可以让我的视图也存储这些信息,以便在管理页面上都可以看到这些信息?

非常感谢您的帮助。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    管理应用附带一个模型 - LogEntry。每次您在管理应用程序中执行某项操作时,都会有一些代码保存LogEntry。这就是应用程序的工作方式。例如在changeform_view 中有这样的内容:

    def changeform_view(self, request, ...):
        ...
        if request.method == "POST":
            if all_valid(formsets) and form_validated:
                # do some other stuff then
                self.log_change(request, new_object, change_message)
    
    def log_change(self, request, object, message):
        """
        Log that an object has been successfully changed.
    
        The default implementation creates an admin LogEntry object.
        """
        from django.contrib.admin.models import CHANGE, LogEntry
        return LogEntry.objects.log_action(
            user_id=request.user.pk,
            content_type_id=get_content_type_for_model(object).pk,
            object_id=object.pk,
            object_repr=str(object),
            action_flag=CHANGE,
            change_message=message,
        )
    

    LogEntry.objects.log_action 是创建日志的位置。不幸的是,这不会发生在其他任何地方,除非你要让它发生。

    不过,没有什么能阻止你这样做。您可以在任何地方创建LogEntry

    话虽如此,这可能有点令人困惑,因为当您看到 LogEntry 时,您现在不再不知道这是由于有人通过管理应用程序手动更改某些数据而发生的更改,或者以编程方式发生。创建您自己的Log 模型并在您需要的时间和地点保存日志可能是一个更好的主意。

    如果您愿意,您可以随时在相关管理视图中显示您的日志。像这样的东西可以解决问题:

    class MyAdmin(admin.modelAdmin):
        readonly_fields = (logs_field,)
    
        def logs_field(self, instance):
            logs = Log.objects.filter(object=instance)
            return format_html_join(
                '\n', "<p>{}: {}</p>",
                ((log.date, log.message) for log in logs)
            )
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多