diff --git a/lpon_site/frontend/admin.py b/lpon_site/frontend/admin.py
index c92c6f9..16bf44b 100644
--- a/lpon_site/frontend/admin.py
+++ b/lpon_site/frontend/admin.py
@@ -13,8 +13,9 @@ from .models import (
)
# ============================================================================
-# Кастомная форма для админки TbImage
-# ============================================================================
+# АДМИНИСТРИРОВАНИЕ TbImage
+#
+# Кастомня форма для админки TbImage
class TbImageAdminForm(forms.ModelForm):
"""
Кастомная форма для TbImage в админке.
@@ -111,7 +112,7 @@ class TbImageAdminForm(forms.ModelForm):
'class': 'codemirror-width-s codemirror-no-lines',
})
-
+# Админка для TbImage с кастомной формой
class ImageAdmin(admin.ModelAdmin):
"""
Админ для изображений TbImage с поддержкой редактирования метаданных filer_image.
@@ -283,12 +284,83 @@ class MusicStyleAdmin(admin.ModelAdmin):
readonly_fields = ('s_style_slug',)
+# ============================================================================
+# АДМИНКА для TbArtist
+#
+# Кастомная форма для
+class ArtistAdminForm(forms.ModelForm):
+ """
+ Кастомная форма для админки продавца (Seller).
+ Добавлaет виджеты CodeMirror для текстовых полей
+ """
+ class Meta:
+ model = TbArtist
+ fields = ('s_artist', 'k_artist_to_article', 'j_artist_metadata', )
+ def __init__(self, *args, **kwargs):
+ """
+ При инициализации формы подгружаем
+ """
+ # Атрибуты для активации CodeMirror редактора
+ codemirror_attrs = {
+ 'data-codemirror-editor': '1',
+ 'data-width': '100%', # Ширина для патча (100% займет полную ширину)
+ }
+
+ super().__init__(*args, **kwargs)
+
+ # Активируем CodeMirror и устанавливаем классы для реальных полей
+ self.fields['s_artist'].widget = Textarea(attrs={
+ **codemirror_attrs,
+ 'data-codemirror-mode': 'text',
+ 'class': 'codemirror-width-xl codemirror-no-lines',
+ })
+ self.fields['j_artist_metadata'].widget = Textarea(attrs={
+ **codemirror_attrs,
+ 'data-language': 'json',
+ 'class': 'codemirror-width-l codemirror-min-height-5',
+ })
+
+# Админка для TbArtist с кастомной формой
class ArtistAdmin(admin.ModelAdmin):
"""Админ для артистов"""
+ form = ArtistAdminForm # Используем кастомную форму с виртуальными полями
+
+ # Подключаем JS через Media (правильный способ!)
+ class Media:
+ css = {
+ 'all': ('codemirror/codemirror-styles.css',) # Стили для CodeMirror
+ }
+ js = (
+ 'codemirror/editor.js', # Основной CodeMirror
+ 'codemirror/codemirror-patch.js', # Патч для управления высотой/шириной
+ )
+
list_display = ('id', 's_artist', 't_artist_created')
+ list_display_links = ('id', 's_artist',)
search_fields = ('s_artist',)
readonly_fields = ('t_artist_created', 't_artist_updated')
+ fieldsets = (
+ ('Основные данные об исполнителе (артисте, группе)', {
+ 'fields': ('s_artist', 'j_artist_metadata',),
+ }),
+ ('Связанная публикация', {
+ 'fields': ('k_artist_to_article', ),
+ 'description': 'Прикрепленная статья (если есть) будет отображаться на странице исполнителя'
+ ' на сайте. Также позволяет получать список всех альбом исполнителя, управлять'
+ ' SEO-атрибутами для улучшения видимости поисковых систем, иметь красивый'
+ ' slag для URL-странички, подсчитывать число просмотров и добавлений'
+ ' в избранные. ОЧЕНЬ РЕКОМЕНДУЕТСЯ СОЗДАВАТЬ'
+ ' И ПРИВЯЗЫВАТЬ СТАТЬЮ ВРУЧНУЮ. Если публикация не создана вручную,'
+ ' то она будет создана автоматически (пустая) при сохранении исполнителя,'
+ ' со всеми SEO-атрибутами и slag, но автоматика несовершенна.
',
+ # 'classes': ('collapse',),
+ }),
+ ('Служебная информация', {
+ 'fields': ('t_artist_created', 't_artist_updated'),
+ 'classes': ('collapse',),
+ }),
+ )
class ItemAdmin(admin.ModelAdmin):
@@ -358,11 +430,11 @@ class SellerAdmin(admin.ModelAdmin):
'codemirror/editor.js', # Основной CodeMirror
'codemirror/codemirror-patch.js', # Патч для управления высотой/шириной
)
- list_display = ('id', 's_seller', 'l_seller_type', 'l_seller_currency', 't_seller_created')
- list_filter = ('l_seller_type', 'l_seller_currency', )
+ list_display = ('id', 's_seller', 'l_seller_type', 'l_seller_currency', 't_seller_created',)
+ list_display_links = ('id', 's_seller',)
+ list_filter = ('l_seller_type', 'l_seller_currency',)
search_fields = ('s_seller',)
- readonly_fields = ('t_seller_created', 't_seller_updated')
-
+ readonly_fields = ('t_seller_created', 't_seller_updated',)
fieldsets = (
('Основные данные о продавце', {
'fields': ('s_seller', 'l_seller_currency', 'l_seller_type',
@@ -445,6 +517,7 @@ class SourceAdmin(admin.ModelAdmin):
'codemirror/codemirror-patch.js', # Патч для управления высотой/шириной
)
list_display = ('id', 's_source_name', 'k_source_to_seller', 'l_source_type', 't_source_data')
+ list_display_links = ('id', 's_source_name',)
list_filter = ('l_source_type', 't_source_data')
search_fields = ('s_source_name',)
readonly_fields = ('t_source_created', 't_source_updated')