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
相关产品推荐
相关产品推荐

