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

Django timezone.now()返回None 视图给模型date字段赋值失败求助

问题1:日期无法写入的修复方法

你的视图代码存在三处关键错误:

  • 表单验证方法调用错误:is_valid 是表单实例的方法,必须加括号执行,你写的if form.is_valid只是判断方法对象是否存在,永远返回布尔真,并未实际执行验证逻辑。
  • form.save(commit=False) 会返回未持久化到数据库的模型实例,你没有用变量接收该实例,直接给form.date赋值是给表单对象新增属性,不会同步到模型数据中。
  • 原代码中render仅在else分支返回,POST提交且表单验证失败时会无返回值,触发服务器错误。

修正后的视图代码如下:

def create(request):
    if request.method == "POST":
        form = CreateListing(request.POST)
        # 修正1:调用is_valid()方法执行验证
        if form.is_valid():
            # 修正2:接收返回的模型实例
            listing = form.save(commit=False)
            listing.date = timezone.now()
            listing.save()
            return HttpResponseRedirect(reverse("index"))
    else:
        form = CreateListing()
    # 修正3:把render提到外层,覆盖所有分支
    return render(request, "auctions/create.html", {
            "form": form
        })

如果你想使用auto_now_add=True实现自动写入,不需要手动赋值date,只需要修改模型字段为:

date = models.DateTimeField(auto_now_add=True)

此时视图可以简化为验证通过后直接调用form.save()即可,无需手动处理date字段。


问题2:时区显示异常的说明

Django的DateTimeField默认采用UTC时间存储数据,这是官方推荐的最佳实践,避免跨时区场景下的时间混乱。你设置的TIME_ZONE = 'America/Vancouver'仅作用于时间的展示阶段:

  • 确保你的settings.py中USE_TZ = True配置已开启
  • 在模板中直接输出date字段时,Django会自动转换为你配置的温哥华时区时间
  • 若在Python代码中需要获取本地时区时间,可使用timezone.localtime(listing.date)进行转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:21:01