mod: валидатор форм, парсера и моделей (17) подключены хелперы автоматического создания статей к исполнителям (модель TbSeller и админке SellerAdmin). Проверка синонимов для продавцов не нужна.
This commit is contained in:
@@ -797,6 +797,38 @@ class SellerAdmin(admin.ModelAdmin):
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# ВАЖНО. Так как продавцам не нужны синонимы, то CSS и JS для админки обогащать не нужно.
|
||||||
|
def save_model(
|
||||||
|
self,
|
||||||
|
request: HttpRequest,
|
||||||
|
obj: TbSeller,
|
||||||
|
form: forms.ModelForm,
|
||||||
|
change: bool,
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Переопределяем save_model для добавления информативных сообщений в админку.
|
||||||
|
|
||||||
|
Максимально поджарый код - все сложности с получением старого значения
|
||||||
|
и определением типа операции делает хелпер generate_admin_save_message().
|
||||||
|
"""
|
||||||
|
# Стандартное сохранение записи через Django
|
||||||
|
# (в т.ч. автоматическое создание связанной статьи в методе save модели TbSeller)
|
||||||
|
super().save_model(request, obj, form, change)
|
||||||
|
|
||||||
|
# Генерируем и отправляем информативное сообщение о сохранении
|
||||||
|
# Хелпер сам:
|
||||||
|
# - определяет тип операции (create vs update)
|
||||||
|
# - формирует нужное сообщение (success vs warning)
|
||||||
|
generate_admin_save_message(
|
||||||
|
request=request,
|
||||||
|
obj=obj,
|
||||||
|
is_new=not change, # Django: change=False для новых, True для существующих
|
||||||
|
related_article=obj.k_seller_to_article,
|
||||||
|
obj_field_name='s_seller',
|
||||||
|
article_title_field='s_article_title',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ============================================================================
|
# ============================================================================
|
||||||
# АДМИНКА ИСТОЧНИКОВ ДАННЫХ
|
# АДМИНКА ИСТОЧНИКОВ ДАННЫХ
|
||||||
|
|||||||
@@ -952,6 +952,29 @@ class TbSeller(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"seller: {self.id:0>2}: {self.s_seller}"
|
return f"seller: {self.id:0>2}: {self.s_seller}"
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
Переопределяем save для привязки связанной статьи о продавце.
|
||||||
|
|
||||||
|
0. ВАЖНО: Продавцам не нужны синонимы (хотя технически возможно), потому синонимы не проверяем и не обновляем
|
||||||
|
1. Если статья не привязана - создаём новую статью исполнителя автоматически
|
||||||
|
2. Генерируем технический заголовок и slug для статьи
|
||||||
|
"""
|
||||||
|
# ===== СОЗДАНИЕ ИЛИ ПОЛУЧЕНИЕ СВЯЗАННОЙ СТАТЬИ =====
|
||||||
|
# Используем универсальный хелпер для создания/поиска статьи
|
||||||
|
# Хелпер сам проверит через обратный FK, не дублирует статьи даже если админ переименовал
|
||||||
|
article = create_or_get_related_article(
|
||||||
|
self,
|
||||||
|
TbArticle.ArticleType.SELLER,
|
||||||
|
's_seller',
|
||||||
|
'j_seller_metadata',
|
||||||
|
'k_seller_to_article' # ← Явно передаем имя FK поля (избегаем "магии")
|
||||||
|
)
|
||||||
|
self.k_seller_to_article = article
|
||||||
|
|
||||||
|
# Вызываем оригинальный save родительского класса
|
||||||
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = 'Продавец'
|
verbose_name = 'Продавец'
|
||||||
verbose_name_plural = 'Продавцы'
|
verbose_name_plural = 'Продавцы'
|
||||||
|
|||||||
Reference in New Issue
Block a user