Untitled
Anonymous
plain_text
02/07/2026 8:07 AM
4.9 KB
13
Indexable
from django.contrib import admin
from django.utils.html import format_html
from .models import Game, Screenshot
class ScreenshotInline(admin.TabularInline):
model = Screenshot
extra = 1
fields = ['image', 'caption', 'preview_thumbnail']
readonly_fields = ['preview_thumbnail']
@admin.display(description="Превью")
def preview_thumbnail(self, obj):
if obj.image:
return format_html('<img src="{}" width="80" height="80" style="border-radius: 5px; object-fit: cover;" />', obj.image.url)
return "-"
@admin.register(Game)
class GameAdmin(admin.ModelAdmin):
list_display = ['preview_thumbnail', 'title', 'genre', 'release_date', 'screenshots_count', 'create_at']
list_filter = ['genre', 'release_date']
search_fields = ['title', 'description']
date_hierarchy = 'release_date'
inlines = [ScreenshotInline]
fieldsets = (
('Основная информация', {
'fields': ('title', 'genre', 'description')
}),
('Медиа', {
'fields': ('preview_image', 'video_url')
}),
('Дополнительно', {
'fields': ('system_requirements', 'release_date')
})
)
readonly_fields = ['create_at']
@admin.display(description="Превью", ordering='title')
def preview_thumbnail(self, obj):
if obj.preview_image:
return format_html('<img src="{}" width="60" height="60" style="border-radius: 8px; object-fit: cover; box-shadow: 0 2px 4px rgba(0,0,0,0.1);" />',
obj.preview_image.url)
return format_html(
'<div style="width: 60px; height: 60px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 24px;">🎮</div>'
)
@admin.display(description="Скриншоты")
def screenshots_count(self, obj):
count = obj.screenshots.count()
if count > 0:
return format_html('<span style="background: #4CAF50; color: white; padding: 3px 8px; border-radius: 12px; font-size: 12px; font-weight: bold;">📸 {}</span>',
count
)
return format_html('<span style="color: #999;">-</span>')
@admin.register(Screenshot)
class ScreenshotAdmin(admin.ModelAdmin):
list_display = ['preview_thumbnail', 'game', 'caption', 'create_at']
list_filter = ['game', 'create_at']
search_fields = ['caption', 'game__title']
list_per_page = 30
readonly_fields = ['create_at', 'large_preview']
fieldsets = (
('Основная информация', {
'fields': ('game', 'image', 'caption')
}),
('Превью', {
'fields': ('large_preview',),
'classes': ('collapse',)
}),
('Метаданные', {
'fields': ('create_at',)
}),
)
@admin.display(description='Превью')
def preview_thumbnail(self, obj):
if obj.image:
return format_html(
'<img src="{}" width="80" height="80" style="border-radius: 5px; object-fit: cover; box-shadow: 0 2px 4px rgba(0,0,0,0.1);" />',
obj.image.url
)
return "—"
@admin.display(description='Большое превью')
def large_preview(self, obj):
if obj.image:
return format_html(
'<img src="{}" style="max-width: 600px; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.2);" />',
obj.image.url
)
return "Изображение не загружено"
Editor is loading...
Leave a Comment