如何让django_comments_xtd的Comment模型适配多个Django+Wagtail自定义模型?
解决方案
结论:不需要额外创建新的评论模型,仅需要调整现有Comment模型的硬编码关联逻辑即可适配新增的SurveyPoll模型,具体修改如下:
步骤1:调整Comment模型的关联逻辑
原模型中硬编码绑定了PostDetail关联,修改为适配所有Wagtail页面子类的通用关联即可:
from wagtail.models import Page # Wagtail<3.0版本请从wagtail.core.models导入 class Comment(XtdComment): # 将原指向PostDetail的外键替换为指向Wagtail通用Page基类 page = models.ForeignKey(Page, on_delete=models.CASCADE) def save(self, *args, **kwargs): if self.user: self.user_name = self.user.username # 移除硬编码的PostDetail查询,直接用XtdComment内置的content_object属性 # 会自动根据content_type、object_pk返回对应的关联实例,支持PostDetail/SurveyPoll等所有Page子类 self.page = self.content_object super(Comment, self).save(*args, **kwargs)
步骤2:SurveyPoll模型无需额外适配
你新增的SurveyPoll正常继承Page即可,不需要做额外的评论相关配置:
class SurveyPoll(Page): # 你自定义的SurveyPoll业务字段 ...
步骤3:前端渲染适配
在SurveyPoll的页面模板渲染评论组件时,和原有PostDetail的用法完全一致,只要把关联对象替换为当前SurveyPoll实例即可,django_comments_xtd会自动处理content_type、object_pk的赋值。
额外说明
注意:如果需要在Comment逻辑中访问关联页面的子类特有属性,可以通过
self.page.specific获取实际的子类实例(自动返回PostDetail或SurveyPoll的实例),避免字段不存在报错。
存量数据兼容:如果你已经有PostDetail的历史评论数据,修改外键关联到Page后不需要额外做数据处理,Wagtail所有Page子类的主键都和Page表主键一一对应,原有数据不会出现关联失效问题。
内容的提问来源于stack exchange,提问作者Yan Tian
相关产品推荐
相关产品推荐

