【问题标题】:Django - Custom Admin Actions LoggingDjango - 自定义管理操作日志
【发布时间】:2013-03-14 08:17:45
【问题描述】:

您在 Django Admin 中所做的所有更改都记录在 django_admin_table 表中,您还可以在“最近的操作”中查看您最近的更改。

但是当您编写自己的“管理操作”并通过它们进行更改时,默认情况下不会记录任何内容。

例子:

def make_checked(modeladmin, request, queryset):
    queryset.update(checked = 1)
make_checked.short_description = 'Mark selected products as checked'

我现在的问题是是否可以记录自定义管理员操作,如果可以,如何?

【问题讨论】:

标签: python django


【解决方案1】:

查看管理员的LogEntry 模型,更重要的是LogEntryManager。模型管理器提供了一个log_action 方法,可以很容易地添加您自己的日志条目(这是未经测试的,但应该给你的想法):

from django.contrib.admin.models import LogEntry, CHANGE
from django.contrib.contenttypes.models import ContentType

def make_checked(modeladmin, request, queryset):
    queryset.update(checked = 1)

    ct = ContentType.objects.get_for_model(queryset.model)
    for obj in queryset:
        LogEntry.objects.log_action(
            user_id=request.user.id, 
            content_type_id=ct.pk,
            object_id=obj.pk,
            object_repr=obj.description,
            action_flag=CHANGE,
            change_message="You have ...") 
make_checked.short_description = 'Mark selected products as checked'

您可以查看logging being used in the normal django admin 的一些示例。如果您只想为整个查询集添加一个 LogEntry,您可以手动完成(因为上面的 log_entry 需要一组特定的参数来记录单个对象):

l = LogEntry(user_id=request.user.id, actions_flag=CHANGE, change_message="...")
l.save()

【讨论】:

    【解决方案2】:

    如果您有可用的ModelAdmin,实际上现在有一种比接受的答案更简单的方法,您可以在自定义操作的情况下执行此操作。

    ModelAdmin 类没有很好的文档记录,但它实际上是 provides these methods 的快捷方式:

    def log_addition(self, request, object, message):
        """
        Log that an object has been successfully added.
    
        The default implementation creates an admin LogEntry object.
        """
    
    def log_change(self, request, object, message):
        """
        Log that an object has been successfully changed.
    
        The default implementation creates an admin LogEntry object.
        """
    
    def log_deletion(self, request, object, object_repr):
        """
        Log that an object will be deleted. Note that this method must be
        called before the deletion.
    
        The default implementation creates an admin LogEntry object.
        """
    

    这些都很容易使用。继续问题中的示例:

    def make_checked(modeladmin, request, queryset):
        queryset.update(checked = 1)
        for obj in queryset:
            modeladmin.log_change(request, obj, 'Marked checked: ' + str(obj))
    make_checked.short_description = 'Mark selected products as checked'
    

    【讨论】:

    • ModelAdmin 需要初始化,但是日志方法可以用作静态方法,传递任何东西作为第一个参数 ``` from django.contrib.admin.options import ModelAdmin ModelAdmin.log_change(None, request, obj , 消息) ```
    【解决方案3】:

    谢谢!经过一些小改动后完美运行:

    def make_checked(modeladmin, request, queryset):
        queryset.update(checked = 1)
    
        ct = ContentType.objects.get_for_model(queryset.model) # for_model --> get_for_model
        for obj in queryset:
            LogEntry.objects.log_action( # log_entry --> log_action
                user_id = request.user.id,
                content_type_id = ct.pk,
                object_id = obj.pk,
                object_repr = obj.title,
                action_flag = CHANGE, # actions_flag --> action_flag
                change_message = 'Changed checked.')
    make_checked.short_description = 'Mark selected products as checked'
    

    【讨论】:

    • 糟糕。那太草率了。无论如何,我已经更新了我的帖子以明确。确保接受其中一个答案是正确的
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2012-03-26
    • 2015-05-15
    • 2022-10-19
    • 1970-01-01
    • 2019-05-26
    • 2011-03-15
    相关资源
    最近更新 更多