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