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

