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

Django模型自定义unpublish方法调用后未修改数据库状态

问题修复方案

你的代码存在两处核心逻辑错误,导致字段未更新,修复方式如下:

核心错误点

  • 模型方法赋值逻辑错误
    unpublish方法中你使用了==相等判断运算符,不会修改published属性值,仅会返回布尔判断结果,需要替换为=赋值运算符。
  • 视图方法未正确调用
    最初视图中写的post.unpublish没有加括号,仅引用了方法对象,没有执行实际的方法逻辑,需要加括号完成调用post.unpublish()。

其余可优化问题

你最终版本的视图存在返回值错误:messages.warning是消息附加方法,不能直接作为响应返回,需要添加消息后统一返回重定向;路由中的slug参数缺少路径转换器声明,匹配规则不严谨。

修复后完整代码

模型方法修复

class Post(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
    published = models.BooleanField(default=False, null=True, blank=True)

    def unpublish(self):
        # 替换==为=完成赋值
        self.published = False
        self.save()

视图代码修复

@require_http_methods(['POST', 'DELETE'])
def unpublish_post(request, slug):
    post = get_object_or_404(Post, slug=slug)
    if post.published:
        post.unpublish()
        messages.success(request, "文章已成功取消发布")
    else:
        messages.warning(request, "Post already not published")
    # 统一返回重定向,不要直接返回messages对象
    return redirect('dashboard')

路由规则修复

# 补充slug路径转换器,规范参数匹配
path('unpublish-post/<slug:slug>/', unpublish_post, name='unpublish-post'),

内容的提问来源于stack exchange,提问作者sam hassan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:30:02