Django-CMS CMSPlugin 不触发 pre_save/post_save 信号
Django-CMS CMSPlugin doesn't trigger pre_save/post_save signals
我正在尝试将 Django-CMS 占位符的内容添加到搜索索引(使用 Algolia,但我想这可能适用于任何索引服务,如 Elasticsearch 或类似服务),只要它们已更新。
使用 Django 1.10,django-cms 3.42,我有这个模型(针对这个问题进行了简化):
from django.db import models
from cms.models.fields import PlaceholderField
from cms.models import CMSPlugin
class NewsItem(models.Model):
title=models.CharField(_('title'), max_length=200),
content = PlaceholderField('news_content')
模型字段 'content' 保存后,我需要做一些额外的处理,显然最好的检查方法是监视 CMSPlugin
模型。所以我从 django.db.models.signals.post_save
中寻找保存,如下所示:
@receiver(post_save, sender=CMSPlugin)
def test(sender, **kwargs):
logger.info("Plugin saved.")
现在,问题是 post_save
没有像我想象的那样被触发。对于普通的 CMS 页面,我注意到 post_save
仅在发布页面时触发,但在 CMS 外部使用时没有明显的方法来发布占位符。
我发现的最接近的相似案例是 ,但建议的解决方案不起作用。
我该如何解决这个问题?
谢谢!
我们在实施 djangocms-algolia 包时也遇到了同样的搜索索引问题,因为占位符更新不会触发索引更新。
对于 CMS 页面,我们使用了 cms.signals
模块 here 中的 post_publish
和 post_unpublish
。
对于使用占位符(例如 djangocms-blog)的 cms 应用程序,我们将侦听器附加到 post_placeholder_operation
,但请注意,要使其正常工作,您的 ModelAdmin 需要继承自 PlaceholderAdminMixin
:
def update_news_index(sender, operation: str, language: str, **kwargs) -> None:
placeholder: Optional[Placeholder] = None
if operation in (ADD_PLUGIN, DELETE_PLUGIN, CHANGE_PLUGIN, CLEAR_PLACEHOLDER):
placeholder = kwargs.get('placeholder')
elif operation in (ADD_PLUGINS_FROM_PLACEHOLDER, PASTE_PLUGIN, PASTE_PLACEHOLDER):
placeholder = kwargs.get('target_placeholder')
elif operation in (MOVE_PLUGIN, CUT_PLUGIN):
placeholder = kwargs.get('source_placeholder')
else:
pass
if placeholder:
post: Post = Post.objects.language(language_code=language).filter(content=placeholder).first()
if post:
post.save()
signals.post_placeholder_operation.connect(update_news_index, PostAdmin)
signals.post_placeholder_operation.connect(update_news_index, PageAdmin)
我正在尝试将 Django-CMS 占位符的内容添加到搜索索引(使用 Algolia,但我想这可能适用于任何索引服务,如 Elasticsearch 或类似服务),只要它们已更新。
使用 Django 1.10,django-cms 3.42,我有这个模型(针对这个问题进行了简化):
from django.db import models
from cms.models.fields import PlaceholderField
from cms.models import CMSPlugin
class NewsItem(models.Model):
title=models.CharField(_('title'), max_length=200),
content = PlaceholderField('news_content')
模型字段 'content' 保存后,我需要做一些额外的处理,显然最好的检查方法是监视 CMSPlugin
模型。所以我从 django.db.models.signals.post_save
中寻找保存,如下所示:
@receiver(post_save, sender=CMSPlugin)
def test(sender, **kwargs):
logger.info("Plugin saved.")
现在,问题是 post_save
没有像我想象的那样被触发。对于普通的 CMS 页面,我注意到 post_save
仅在发布页面时触发,但在 CMS 外部使用时没有明显的方法来发布占位符。
我发现的最接近的相似案例是
我该如何解决这个问题?
谢谢!
我们在实施 djangocms-algolia 包时也遇到了同样的搜索索引问题,因为占位符更新不会触发索引更新。
对于 CMS 页面,我们使用了 cms.signals
模块 here 中的 post_publish
和 post_unpublish
。
对于使用占位符(例如 djangocms-blog)的 cms 应用程序,我们将侦听器附加到 post_placeholder_operation
,但请注意,要使其正常工作,您的 ModelAdmin 需要继承自 PlaceholderAdminMixin
:
def update_news_index(sender, operation: str, language: str, **kwargs) -> None:
placeholder: Optional[Placeholder] = None
if operation in (ADD_PLUGIN, DELETE_PLUGIN, CHANGE_PLUGIN, CLEAR_PLACEHOLDER):
placeholder = kwargs.get('placeholder')
elif operation in (ADD_PLUGINS_FROM_PLACEHOLDER, PASTE_PLUGIN, PASTE_PLACEHOLDER):
placeholder = kwargs.get('target_placeholder')
elif operation in (MOVE_PLUGIN, CUT_PLUGIN):
placeholder = kwargs.get('source_placeholder')
else:
pass
if placeholder:
post: Post = Post.objects.language(language_code=language).filter(content=placeholder).first()
if post:
post.save()
signals.post_placeholder_operation.connect(update_news_index, PostAdmin)
signals.post_placeholder_operation.connect(update_news_index, PageAdmin)