admin.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # admin.py
  2. from django.contrib import admin
  3. from django.db.models import Avg, Count
  4. from .models import Musician, Genre, Album, Song, Meloman, Rating, Preference
  5. # Сначала зарегистрируйте модели, используемые в autocomplete_fields
  6. @admin.register(Genre)
  7. class GenreAdmin(admin.ModelAdmin):
  8. list_display = ('genre_name',)
  9. search_fields = ('genre_name',) # Важно для autocomplete!
  10. @admin.register(Album)
  11. class AlbumAdmin(admin.ModelAdmin):
  12. list_display = ('album_name', 'musician')
  13. search_fields = ('album_name', 'musician__name') # Важно для autocomplete!
  14. list_select_related = ('musician',)
  15. @admin.register(Musician)
  16. class MusicianAdmin(admin.ModelAdmin):
  17. list_display = ('name', 'city', 'birth_year')
  18. search_fields = ('name', 'city')
  19. @admin.register(Song)
  20. class SongAdmin(admin.ModelAdmin):
  21. list_display = ('title', 'album', 'genre', 'duration_formatted', 'avg_rating')
  22. list_filter = ('genre', 'album__musician')
  23. search_fields = ('title',)
  24. autocomplete_fields = ['album', 'genre'] # Теперь работает, т.к. админы зарегистрированы
  25. def get_queryset(self, request):
  26. return super().get_queryset(request).annotate(
  27. avg_rating_value=Avg('rating__score')
  28. )
  29. def avg_rating(self, obj):
  30. if hasattr(obj, 'avg_rating_value') and obj.avg_rating_value:
  31. return f"{obj.avg_rating_value:.1f} ★"
  32. return "Нет оценок"
  33. avg_rating.short_description = "Средний рейтинг"
  34. def duration_formatted(self, obj):
  35. return obj.duration_formatted if obj.duration_sec else "00:00"
  36. duration_formatted.short_description = "Длительность"
  37. @admin.register(Meloman)
  38. class MelomanAdmin(admin.ModelAdmin):
  39. list_display = ('full_name', 'gender', 'city', 'age')
  40. search_fields = ('full_name', 'city')
  41. list_filter = ('gender', 'city')
  42. def age(self, obj):
  43. return obj.age if obj.age else "—"
  44. age.short_description = "Возраст"
  45. @admin.register(Rating)
  46. class RatingAdmin(admin.ModelAdmin):
  47. list_display = ('song', 'meloman', 'score', 'rating_date')
  48. list_filter = ('score', 'rating_date')
  49. search_fields = ('song__title', 'meloman__full_name')
  50. autocomplete_fields = ['song', 'meloman']
  51. list_select_related = ('song', 'meloman')
  52. @admin.register(Preference)
  53. class PreferenceAdmin(admin.ModelAdmin):
  54. list_display = ('meloman', 'genre')
  55. list_filter = ('genre',)
  56. search_fields = ('meloman__full_name', 'genre__genre_name')
  57. autocomplete_fields = ['meloman', 'genre']