#gq:
from django.contrib import admin
from django.contrib.admin.models import DELETION
from django.contrib.contenttypes.models import ContentType
from django.urls import reverse, NoReverseMatch
from django.utils.encoding import force_str
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
class LogEntryAdmin(admin.ModelAdmin):
"""Admin操作日志自定义管理类:优化展示与权限控制"""
list_filter = ['content_type'] # 按内容类型筛选
search_fields = ['object_repr', 'change_message'] # 搜索对象描述、操作信息
list_display_links = ['action_time', 'get_change_message'] # 可点击跳转字段
list_display = ['action_time', 'user_link', 'content_type', 'object_link', 'get_change_message'] # 列表展示字段
def has_add_permission(self, request):
"""禁用添加:日志自动生成,不允许手动添加"""
return False
def has_change_permission(self, request, obj=None):
"""仅超级用户/有权限用户可查看,禁止POST修改"""
return (request.user.is_superuser or request.user.has_perm('admin.change_logentry')) and request.method != 'POST'
def has_delete_permission(self, request, obj=None):
"""禁用删除:日志需保留"""
return False
def object_link(self, obj):
"""操作对象字段:非删除操作显示Admin编辑链接"""
object_link = escape(obj.object_repr)
if obj.action_flag != DELETION and obj.content_type:
try:
url = reverse(f'admin:{obj.content_type.app_label}_{obj.content_type.model}_change', args=[obj.object_id])
object_link = f'{object_link}'
except NoReverseMatch:
pass
return mark_safe(object_link)
object_link.admin_order_field = 'object_repr'
object_link.short_description = _('object')
def user_link(self, obj):
"""操作用户字段:显示用户Admin编辑链接"""
content_type = ContentType.objects.get_for_model(type(obj.user))
user_link = escape(force_str(obj.user))
try:
url = reverse(f'admin:{content_type.app_label}_{content_type.model}_change', args=[obj.user.pk])
user_link = f'{user_link}'
except NoReverseMatch:
pass
return mark_safe(user_link)
user_link.admin_order_field = 'user'
user_link.short_description = _('user')
def get_queryset(self, request):
"""预加载content_type,优化查询性能"""
return super().get_queryset(request).prefetch_related('content_type')
def get_actions(self, request):
"""移除批量删除操作"""
actions = super().get_actions(request)
del actions['delete_selected']
return actions