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

Django中状态为Draft的Buzz无法存入数据库,状态为Published可正常保存

Django中状态为Draft的Buzz无法存入数据库,状态为Published可正常保存

嘿,我瞅了你的代码,很快就发现了一个容易忽略的小问题,这大概率就是导致你遇到麻烦的根源!

在你的buzz_create视图里,判断表单有效性的代码写错了:

if form.is_valid:  # 这里少了关键的括号!

正确的写法应该是:

if form.is_valid():

在Python里,form.is_valid是一个方法对象,它的布尔值永远为True——也就是说不管表单数据是不是真的符合要求,这个条件都会成立。这就导致了:当你选择Draft状态时,可能表单里藏着验证错误(比如slug字段不符合规则?),但代码还是硬着头皮执行了buzz.save(),可模型层面的验证没通过,数据根本存不进数据库,同时你又执行了跳转,所以你看到了302响应,但数据库里啥都没有。而当你选Published状态时,刚好表单数据完全合规,所以就能正常保存了。

另外,你可以再检查这几个地方,确保后续没问题:

  • 确认BuzzCreateForm的Meta类里包含了status字段,保证表单能正确接收状态值
  • 留意slug字段:因为你设置了unique_for_date='publish',如果创建Draft时,publish时间和已有同slug的Buzz重复,会触发唯一约束冲突导致保存失败。可以考虑给Draft状态的Buzz自动生成临时slug,或者基于title自动填充slug
  • 你添加objects = models.Manager()的操作是对的,避免默认管理器只返回Published数据,但这不是当前问题的原因

修改后的视图代码如下:

def buzz_create(request):
    form = BuzzCreateForm()

    if request.method == 'POST':
        form = BuzzCreateForm(data=request.POST)
        
        if form.is_valid():  # 补上括号
            buzz = form.save(commit=False)
            buzz.author = request.user
            buzz.save()
            
            return redirect(to=reverse('buzz:buzz_list'))

    return render(
        request=request,
        template_name='buzz/create.html',
        context={ 'form': form }
    )

备注:内容来源于stack exchange,提问作者Arvee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:54:34