| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- # admin.py
- from django.contrib import admin
- from django.db.models import Avg, Count
- from .models import Musician, Genre, Album, Song, Meloman, Rating, Preference
- # Сначала зарегистрируйте модели, используемые в autocomplete_fields
- @admin.register(Genre)
- class GenreAdmin(admin.ModelAdmin):
- list_display = ('genre_name',)
- search_fields = ('genre_name',) # Важно для autocomplete!
-
- @admin.register(Album)
- class AlbumAdmin(admin.ModelAdmin):
- list_display = ('album_name', 'musician')
- search_fields = ('album_name', 'musician__name') # Важно для autocomplete!
- list_select_related = ('musician',)
-
- @admin.register(Musician)
- class MusicianAdmin(admin.ModelAdmin):
- list_display = ('name', 'city', 'birth_year')
- search_fields = ('name', 'city')
- @admin.register(Song)
- class SongAdmin(admin.ModelAdmin):
- list_display = ('title', 'album', 'genre', 'duration_formatted', 'avg_rating')
- list_filter = ('genre', 'album__musician')
- search_fields = ('title',)
- autocomplete_fields = ['album', 'genre'] # Теперь работает, т.к. админы зарегистрированы
-
- def get_queryset(self, request):
- return super().get_queryset(request).annotate(
- avg_rating_value=Avg('rating__score')
- )
-
- def avg_rating(self, obj):
- if hasattr(obj, 'avg_rating_value') and obj.avg_rating_value:
- return f"{obj.avg_rating_value:.1f} ★"
- return "Нет оценок"
- avg_rating.short_description = "Средний рейтинг"
-
- def duration_formatted(self, obj):
- return obj.duration_formatted if obj.duration_sec else "00:00"
- duration_formatted.short_description = "Длительность"
- @admin.register(Meloman)
- class MelomanAdmin(admin.ModelAdmin):
- list_display = ('full_name', 'gender', 'city', 'age')
- search_fields = ('full_name', 'city')
- list_filter = ('gender', 'city')
-
- def age(self, obj):
- return obj.age if obj.age else "—"
- age.short_description = "Возраст"
- @admin.register(Rating)
- class RatingAdmin(admin.ModelAdmin):
- list_display = ('song', 'meloman', 'score', 'rating_date')
- list_filter = ('score', 'rating_date')
- search_fields = ('song__title', 'meloman__full_name')
- autocomplete_fields = ['song', 'meloman']
- list_select_related = ('song', 'meloman')
- @admin.register(Preference)
- class PreferenceAdmin(admin.ModelAdmin):
- list_display = ('meloman', 'genre')
- list_filter = ('genre',)
- search_fields = ('meloman__full_name', 'genre__genre_name')
- autocomplete_fields = ['meloman', 'genre']
|