from django.contrib import admin from django.utils.html import format_html from django.urls import reverse from django.utils.safestring import mark_safe from .models import Food, UserFood, FoodUsageLog @admin.register(Food) class FoodAdmin(admin.ModelAdmin): """食物管理后台""" list_display = [ 'name', 'food_type', 'rarity', 'status', 'is_limited', 'calories', 'created_at', 'image_preview', 'action_buttons' ] list_filter = [ 'food_type', 'rarity', 'status', 'is_limited', 'created_at' ] search_fields = ['name', 'description', 'taste_tags'] list_editable = ['status'] ordering = ['-created_at'] fieldsets = [ ('基本信息', { 'fields': ['name', 'food_type', 'description', 'rarity'] }), ('多媒体资源', { 'fields': ['image', 'animation_file', 'sound_effect'], 'classes': ['collapse'] }), ('营养信息', { 'fields': ['calories', 'taste_tags', 'cooking_methods', 'nutritional_value'], 'classes': ['collapse'] }), ('游戏属性', { 'fields': ['effect_description', 'boost_attributes', 'unlock_condition', 'usage_limit'], 'classes': ['collapse'] }), ('发布设置', { 'fields': ['status', 'is_limited', 'available_from', 'available_until'] }), ('时间信息', { 'fields': ['created_at', 'updated_at', 'published_at'], 'classes': ['collapse'] }) ] readonly_fields = ['created_at', 'updated_at', 'published_at'] def image_preview(self, obj): """显示图片预览""" if obj.image: return format_html( '', obj.image ) return "无图片" image_preview.short_description = "图片预览" def action_buttons(self, obj): """操作按钮""" buttons = [] if obj.status == 'draft': buttons.append( f'发布' ) elif obj.status == 'published': buttons.append( f'归档' ) # 查看详情按钮 detail_url = reverse('admin:food_app_food_change', args=[obj.pk]) buttons.append(f'编辑') return format_html(' '.join(buttons)) action_buttons.short_description = "操作" actions = ['publish_foods', 'archive_foods'] def publish_foods(self, request, queryset): """批量发布食物""" count = 0 for food in queryset: if food.status == 'draft': food.publish() count += 1 self.message_user(request, f'成功发布了 {count} 个食物') publish_foods.short_description = "发布选中的食物" def archive_foods(self, request, queryset): """批量归档食物""" count = 0 for food in queryset: if food.status == 'published': food.archive() count += 1 self.message_user(request, f'成功归档了 {count} 个食物') archive_foods.short_description = "归档选中的食物" @admin.register(UserFood) class UserFoodAdmin(admin.ModelAdmin): """用户食物管理后台""" list_display = [ 'user', 'food', 'quantity', 'used_count', 'obtained_method', 'obtained_at', 'last_used_at', 'can_use_display' ] list_filter = [ 'obtained_method', 'obtained_at', 'food__food_type', 'food__rarity' ] search_fields = ['user__username', 'food__name', 'obtained_method'] ordering = ['-obtained_at'] fieldsets = [ ('关联信息', { 'fields': ['user', 'food'] }), ('数量信息', { 'fields': ['quantity', 'used_count'] }), ('获得信息', { 'fields': ['obtained_at', 'obtained_method'] }), ('使用信息', { 'fields': ['last_used_at'] }) ] readonly_fields = ['obtained_at'] def can_use_display(self, obj): """显示是否可使用""" if obj.can_use(): return format_html('✓ 可使用') else: return format_html('✗ 不可使用') can_use_display.short_description = "状态" def get_queryset(self, request): """优化查询""" return super().get_queryset(request).select_related('user', 'food') @admin.register(FoodUsageLog) class FoodUsageLogAdmin(admin.ModelAdmin): """食物使用记录管理后台""" list_display = [ 'user', 'food', 'used_at', 'usage_context', 'effect_preview' ] list_filter = [ 'used_at', 'usage_context', 'food__food_type', 'food__rarity' ] search_fields = ['user__username', 'food__name', 'usage_context', 'notes'] ordering = ['-used_at'] date_hierarchy = 'used_at' fieldsets = [ ('基本信息', { 'fields': ['user', 'food', 'used_at'] }), ('使用详情', { 'fields': ['usage_context', 'effect_applied', 'notes'] }) ] readonly_fields = ['used_at'] def effect_preview(self, obj): """效果预览""" if obj.effect_applied: # 简化显示JSON内容 import json try: effect_str = json.dumps(obj.effect_applied, ensure_ascii=False) if len(effect_str) > 50: effect_str = effect_str[:50] + '...' return effect_str except: return str(obj.effect_applied)[:50] + '...' return "-" effect_preview.short_description = "应用效果" def get_queryset(self, request): """优化查询""" return super().get_queryset(request).select_related('user', 'food') # 自定义管理后台标题 admin.site.site_header = 'QY LTY 后台管理' admin.site.site_title = 'QY LTY Admin' admin.site.index_title = '欢迎使用 QY LTY 管理后台'