mod: админка (07) SellerAdminForm и SellerAdmin + патч CSS для высоты JSON-поля
This commit is contained in:
@@ -306,9 +306,57 @@ class LabelAdmin(admin.ModelAdmin):
|
|||||||
search_fields = ('s_label',)
|
search_fields = ('s_label',)
|
||||||
readonly_fields = ('t_label_created', 't_label_updated')
|
readonly_fields = ('t_label_created', 't_label_updated')
|
||||||
|
|
||||||
|
# ================
|
||||||
|
# АДМИН-ПАНЕЛЬ ДЛЯ ПРОДАВЦА/SELLER
|
||||||
|
#
|
||||||
|
# Кастомная форма
|
||||||
|
class SellerAdminForm(forms.ModelForm):
|
||||||
|
"""
|
||||||
|
Кастомная форма для админки продавца (Seller).
|
||||||
|
Добавлaет виджеты CodeMirror для текстовых полей
|
||||||
|
"""
|
||||||
|
class Meta:
|
||||||
|
model = TbSeller
|
||||||
|
fields = ('id', 's_seller', 'j_seller_metadata', 'l_seller_type', 'l_seller_currency',)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
При инициализации формы подгружаем
|
||||||
|
"""
|
||||||
|
# Атрибуты для активации CodeMirror редактора
|
||||||
|
codemirror_attrs = {
|
||||||
|
'data-codemirror-editor': '1',
|
||||||
|
'data-width': '100%', # Ширина для патча (100% займет полную ширину)
|
||||||
|
}
|
||||||
|
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
# Активируем CodeMirror и устанавливаем классы для реальных полей
|
||||||
|
self.fields['s_seller'].widget = Textarea(attrs={
|
||||||
|
**codemirror_attrs,
|
||||||
|
'class': 'codemirror-width-l codemirror-no-lines',
|
||||||
|
'data-language': 'text',
|
||||||
|
})
|
||||||
|
self.fields['j_seller_metadata'].widget = Textarea(attrs={
|
||||||
|
**codemirror_attrs,
|
||||||
|
'class': 'codemirror-width-xl codemirror-min-height-5',
|
||||||
|
'data-language': 'json',
|
||||||
|
})
|
||||||
|
|
||||||
|
# Админ для продавца (Seller)
|
||||||
class SellerAdmin(admin.ModelAdmin):
|
class SellerAdmin(admin.ModelAdmin):
|
||||||
"""Админ для продавцов"""
|
"""Админ для продавцов"""
|
||||||
|
form = SellerAdminForm # Используем кастомную форму с виртуальными полями
|
||||||
|
|
||||||
|
# Подключаем JS через Media (правильный способ!)
|
||||||
|
class Media:
|
||||||
|
css = {
|
||||||
|
'all': ('codemirror/codemirror-styles.css',) # Стили для CodeMirror
|
||||||
|
}
|
||||||
|
js = (
|
||||||
|
'codemirror/editor.js', # Основной CodeMirror
|
||||||
|
'codemirror/codemirror-patch.js', # Патч для управления высотой/шириной
|
||||||
|
)
|
||||||
list_display = ('id', 's_seller', 'l_seller_type', 'l_seller_currency', 't_seller_created')
|
list_display = ('id', 's_seller', 'l_seller_type', 'l_seller_currency', 't_seller_created')
|
||||||
list_filter = ('l_seller_type', 'l_seller_currency', )
|
list_filter = ('l_seller_type', 'l_seller_currency', )
|
||||||
search_fields = ('s_seller',)
|
search_fields = ('s_seller',)
|
||||||
|
|||||||
@@ -108,6 +108,7 @@
|
|||||||
# │ l_seller_currency │ (rub, usd, eur, ...)
|
# │ l_seller_currency │ (rub, usd, eur, ...)
|
||||||
# │ l_seller_type │ Тип (seller, label, diy, crowdfunding, other)
|
# │ l_seller_type │ Тип (seller, label, diy, crowdfunding, other)
|
||||||
# │ k_seller_to_article │ 1:1 FK → TbArticle (content, SEO, slug)
|
# │ k_seller_to_article │ 1:1 FK → TbArticle (content, SEO, slug)
|
||||||
|
# │ j_seller_metadata │ JSON с дополнительными данными (ссылки, контакты, соцсети)
|
||||||
# │ t_seller_created │ Timestamp
|
# │ t_seller_created │ Timestamp
|
||||||
# │ t_seller_updated │ Timestamp
|
# │ t_seller_updated │ Timestamp
|
||||||
# │ │ ⬆ Индекс: id
|
# │ │ ⬆ Индекс: id
|
||||||
|
|||||||
@@ -56,6 +56,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* --- Новый класс для минимальной высоты --- */
|
||||||
|
.codemirror-min-height-5 .cm-editor {
|
||||||
|
min-height: 8em; /* 5 строк */
|
||||||
|
}
|
||||||
|
|
||||||
.codemirror-no-lines .cm-gutters {
|
.codemirror-no-lines .cm-gutters {
|
||||||
/* Скрываем нумерацию строк */
|
/* Скрываем нумерацию строк */
|
||||||
display: none !important;
|
display: none !important;
|
||||||
|
|||||||
Reference in New Issue
Block a user