我正在尝试将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,但建议的解决方案并不起作用。
我怎么能解决这个问题?
谢谢!
答案 0 :(得分:1)
实施djangocms-algolia包时,我们也遇到了相同的搜索索引问题,因为占位符更新不会触发索引更新。
对于CMS页面,我们利用了post_publish
模块here中的post_unpublish
和cms.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)