Initial commit: Django gallery project
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
160
gallery/admin.py
Normal file
160
gallery/admin.py
Normal file
@@ -0,0 +1,160 @@
|
||||
from django.contrib import admin
|
||||
from django.utils.html import format_html
|
||||
from .models import Artwork, Category, About, Comment
|
||||
|
||||
|
||||
class CategoryAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'slug', 'created_at', 'updated_at')
|
||||
list_filter = ('created_at', 'updated_at')
|
||||
search_fields = ('name', 'slug')
|
||||
prepopulated_fields = {'slug': ('name',)}
|
||||
ordering = ('name',)
|
||||
|
||||
|
||||
class ArtworkAdmin(admin.ModelAdmin):
|
||||
list_display = (
|
||||
'title',
|
||||
'category',
|
||||
'order',
|
||||
'view_count',
|
||||
'created_at',
|
||||
'thumbnail_preview'
|
||||
)
|
||||
list_filter = ('category', 'created_at')
|
||||
search_fields = ('title', 'description', 'slug')
|
||||
list_editable = ('order',)
|
||||
prepopulated_fields = {'slug': ('title',)}
|
||||
ordering = ('order', '-created_at')
|
||||
readonly_fields = ('view_count', 'created_at', 'updated_at', 'image_preview')
|
||||
fieldsets = (
|
||||
('基本信息', {
|
||||
'fields': ('title', 'slug', 'description', 'category')
|
||||
}),
|
||||
('图片设置', {
|
||||
'fields': ('image', 'image_preview', 'thumbnail')
|
||||
}),
|
||||
('排序与统计', {
|
||||
'fields': ('order', 'view_count')
|
||||
}),
|
||||
('时间信息', {
|
||||
'fields': ('created_at', 'updated_at'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
)
|
||||
|
||||
def thumbnail_preview(self, obj):
|
||||
if obj.thumbnail:
|
||||
return format_html(
|
||||
'<img src="{}" style="max-height: 50px; max-width: 50px;" />',
|
||||
obj.thumbnail.url
|
||||
)
|
||||
return "-"
|
||||
thumbnail_preview.short_description = '缩略图'
|
||||
|
||||
def image_preview(self, obj):
|
||||
if obj.image:
|
||||
return format_html(
|
||||
'<img src="{}" style="max-height: 200px; max-width: 200px;" />',
|
||||
obj.image.url
|
||||
)
|
||||
return "-"
|
||||
image_preview.short_description = '图片预览'
|
||||
|
||||
|
||||
class AboutAdmin(admin.ModelAdmin):
|
||||
list_display = ('title', 'created_at', 'updated_at')
|
||||
readonly_fields = ('created_at', 'updated_at', 'image_preview')
|
||||
fieldsets = (
|
||||
('内容', {
|
||||
'fields': ('title', 'content', 'image')
|
||||
}),
|
||||
('预览', {
|
||||
'fields': ('image_preview',),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
('时间信息', {
|
||||
'fields': ('created_at', 'updated_at'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
)
|
||||
|
||||
def image_preview(self, obj):
|
||||
if obj.image:
|
||||
return format_html(
|
||||
'<img src="{}" style="max-height: 200px; max-width: 200px;" />',
|
||||
obj.image.url
|
||||
)
|
||||
return "-"
|
||||
image_preview.short_description = '图片预览'
|
||||
|
||||
def has_add_permission(self, request):
|
||||
# 只允许有一个关于页面
|
||||
if About.objects.exists():
|
||||
return False
|
||||
return super().has_add_permission(request)
|
||||
|
||||
def has_delete_permission(self, request, obj=None):
|
||||
# 不允许删除关于页面
|
||||
return False
|
||||
|
||||
|
||||
class CommentAdmin(admin.ModelAdmin):
|
||||
"""评论管理"""
|
||||
|
||||
list_display = ['id', 'user', 'artwork', 'text_preview', 'has_image', 'created_at', 'is_active']
|
||||
list_filter = ['artwork', 'user', 'is_active', 'created_at']
|
||||
search_fields = ['text', 'user__username', 'artwork__title']
|
||||
list_editable = ['is_active']
|
||||
list_per_page = 20
|
||||
|
||||
fieldsets = (
|
||||
('基本信息', {
|
||||
'fields': ('artwork', 'user', 'is_active')
|
||||
}),
|
||||
('评论内容', {
|
||||
'fields': ('text', 'image')
|
||||
}),
|
||||
('时间信息', {
|
||||
'fields': ('created_at', 'updated_at'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
)
|
||||
readonly_fields = ('created_at', 'updated_at')
|
||||
|
||||
def text_preview(self, obj):
|
||||
"""文本内容预览"""
|
||||
if obj.text:
|
||||
return obj.text[:50] + '...' if len(obj.text) > 50 else obj.text
|
||||
return '-'
|
||||
text_preview.short_description = '评论内容'
|
||||
|
||||
def has_image(self, obj):
|
||||
"""是否有图片"""
|
||||
return bool(obj.image)
|
||||
has_image.short_description = '有图片'
|
||||
has_image.boolean = True
|
||||
|
||||
actions = ['activate_comments', 'deactivate_comments']
|
||||
|
||||
def activate_comments(self, request, queryset):
|
||||
"""批量激活评论"""
|
||||
updated = queryset.update(is_active=True)
|
||||
self.message_user(request, f'已激活 {updated} 条评论')
|
||||
activate_comments.short_description = '激活选中评论'
|
||||
|
||||
def deactivate_comments(self, request, queryset):
|
||||
"""批量停用评论"""
|
||||
updated = queryset.update(is_active=False)
|
||||
self.message_user(request, f'已停用 {updated} 条评论')
|
||||
deactivate_comments.short_description = '停用选中评论'
|
||||
|
||||
|
||||
admin.site.register(Category, CategoryAdmin)
|
||||
admin.site.register(Artwork, ArtworkAdmin)
|
||||
admin.site.register(About, AboutAdmin)
|
||||
admin.site.register(Comment, CommentAdmin)
|
||||
|
||||
# 自定义管理站点标题
|
||||
admin.site.site_header = 'Yitao-Ren Gallery 管理后台'
|
||||
admin.site.site_title = '画廊管理'
|
||||
admin.site.index_title = '欢迎使用画廊管理后台'
|
||||
Reference in New Issue
Block a user