You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:45:03