Django-CMS CMSPlugin不会触发pre_save / post_save信号

时间:2018-03-01 18:32:38

标签: django django-cms

我正在尝试将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')

我需要在模型字段'内容'之后立即进行一些额外的处理。保存,显然检查它的最佳方法是监视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外部使用时,没有明显的方法可以发布占位符。

我发现的最接近的类似案例是Updating indexes on placeholderfields in real time with django/haystack/solr,但建议的解决方案并不起作用。

我怎么能解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

实施djangocms-algolia包时,我们也遇到了相同的搜索索引问题,因为占位符更新不会触发索引更新。

对于CMS页面,我们利用了post_publish模块here中的post_unpublishcms.signals

对于使用占位符的cms应用程序(例如djangocms-blog),我们将侦听器附加到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)