# Zxy导入Django的admin模块
from django.contrib import admin
# Zxy导入Django的LogEntry模型
from django.contrib.admin.models import DELETION
# Zxy导入Django的内容类型模型
from django.contrib.contenttypes.models import ContentType
# Zxy导入Django的URL工具
from django.urls import reverse, NoReverseMatch
# Zxy导入Django的编码工具
from django.utils.encoding import force_str
# Zxy导入Django的HTML工具
from django.utils.html import escape
# Zxy导入Django的安全字符串工具
from django.utils.safestring import mark_safe
# Zxy导入Django的翻译工具
from django.utils.translation import gettext_lazy as _
# Zxy定义LogEntryAdmin类
class LogEntryAdmin(admin.ModelAdmin):
list_filter = ['content_type'] # Zxy按内容类型过滤
search_fields = ['object_repr', 'change_message'] # Zxy搜索字段
list_display_links = ['action_time', 'get_change_message'] # Zxy显示链接的字段
list_display = ['action_time', 'user_link', 'content_type', 'object_link', 'get_change_message'] # Zxy显示字段
# Zxy检查是否有添加权限
def has_add_permission(self, request):
return False
# Zxy检查是否有修改权限
def has_change_permission(self, request, obj=None):
return (
request.user.is_superuser or
request.user.has_perm('admin.change_logentry')
) and request.method != 'POST'
# Zxy检查是否有删除权限
def has_delete_permission(self, request, obj=None):
return False
# Zxy获取对象链接
def object_link(self, obj):
object_link = escape(obj.object_repr) # Zxy转义对象表示
content_type = obj.content_type
if obj.action_flag != DELETION and content_type is not None: # Zxy检查是否为删除操作
try:
url = reverse( # Zxy生成反向URL
'admin:{}_{}_change'.format(content_type.app_label, content_type.model),
args=[obj.object_id]
)
object_link = '{}'.format(url, object_link) # Zxy生成链接
except NoReverseMatch:
pass
return mark_safe(object_link) # Zxy标记为安全字符串
object_link.admin_order_field = 'object_repr' # Zxy排序字段
object_link.short_description = _('object') # Zxy字段描述
# Zxy获取用户链接
def user_link(self, obj):
content_type = ContentType.objects.get_for_model(type(obj.user)) # Zxy获取用户的内容类型
user_link = escape(force_str(obj.user)) # Zxy转义用户表示
try:
url = reverse( # Zxy生成反向URL
'admin:{}_{}_change'.format(content_type.app_label, content_type.model),
args=[obj.user.pk]
)
user_link = '{}'.format(url, user_link) # Zxy生成链接
except NoReverseMatch:
pass
return mark_safe(user_link) # Zxy标记为安全字符串
user_link.admin_order_field = 'user' # Zxy排序字段
user_link.short_description = _('user') # Zxy字段描述
# Zxy获取查询集
def get_queryset(self, request):
queryset = super(LogEntryAdmin, self).get_queryset(request)
return queryset.prefetch_related('content_type') # Zxy预加载内容类型
# Zxy获取操作
def get_actions(self, request):
actions = super(LogEntryAdmin, self).get_actions(request)
if 'delete_selected' in actions: # Zxy移除删除操作
del actions['delete_selected']
return actions