Wagtail环境下django_comments_xtd派生模型PostComment的save()方法优化
解决方案
你可以通过判断实例是否为新建状态,将自定义逻辑包裹在条件分支内,调整后的PostComment类save()方法如下:
from wagtail.core.models import Page from django_comments_xtd.models import XtdComment from wagtail.models import ParentalKey # 原代码缺失该导入,此处补全避免报错 class PostPage(Page): ... class PostComment(XtdComment): page = ParentalKey('PostPage', on_delete=models.CASCADE, related_name='rn_comments') def save(self, *args, **kwargs): # 仅当为新建实例时执行自定义逻辑 is_new_instance = kwargs.get('force_insert', False) or self._state.adding if is_new_instance: if self.user: self.user_name = self.user.username # 注意:原代码此处调用的PostDetail不存在,应为你定义的PostPage类,已修正避免查询报错 self.page = PostPage.objects.get(pk=self.object_pk) super().save(*args, **kwargs)
逻辑说明
self._state.adding是Django模型内置的状态标识,值为True时代表该实例尚未写入数据库,属于首次创建的新对象kwargs.get('force_insert', False)用于兼容显式传入force_insert参数强制插入的场景,覆盖所有新建实例的边界情况- 修改后只有首次创建评论时才会执行自定义赋值逻辑,后续Wagtail修改关联文章触发的评论更新类save操作,都不会运行这部分代码,避免非预期逻辑执行。
内容的提问来源于stack exchange,提问作者Yan Tian
相关产品推荐
相关产品推荐

