Django DateTimeField赋值datetime.timezone报格式无效错误排查
报错根因
- 表单提交校验失败:视图代码中
post.date_and_time = str(datetime.timezone)是将datetime.timezone类本身转为字符串,最终赋值结果为<class 'datetime.timezone'>,完全不符合DateTimeField要求的YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]时间格式,直接触发字段校验异常。 - 数据库迁移报错:两个触发点:一是模型中
user外键字段设置了无效默认值""(空字符串不是合法的User关联对象,外键字段默认值必须是关联模型实例或合法主键值);二是之前生成的0003_post_date_and_time迁移文件中写入了错误的DateTime字段默认值,执行迁移时触发格式校验。另外终端提示的DEFAULT_AUTO_FIELD配置警告是Django3.2+版本的常规提示,不是报错,不影响核心功能。
正确实现方案
要实现记录帖子提交时间的需求,Django模型层自带对应参数,不需要手动在视图中赋值,可避免时区错误、时间不准的问题,按以下步骤修改即可:
1. 修正模型字段配置
修改models.py,移除无效默认值,用auto_now_add参数实现创建时自动写入当前时间:
from django.db import models from django.contrib.auth.models import User class Post(models.Model): post = models.TextField() # 移除无效的空字符串默认值,帖子关联发布用户,删除用户时级联删除对应帖子 user = models.ForeignKey(User, on_delete=models.CASCADE) likes = models.IntegerField(default=0) # auto_now_add=True:实例第一次创建时自动写入当前时间,兼容Django时区配置 # 不要使用default=datetime.datetime.now,该值会在服务启动时固定,无法记录真实提交时间 date_and_time = models.DateTimeField(auto_now_add=True)
要消除
DEFAULT_AUTO_FIELD警告的话,在项目settings.py中添加配置即可:DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
2. 修正视图逻辑
原视图存在两个问题:一是手动给时间字段赋了无效值,二是表单校验失败时传回模板的是未保存的Post实例而非表单对象,会导致页面渲染异常。因为模型已经配置了自动填充时间,不需要手动赋值,修改后代码如下:
from django.shortcuts import render from .forms import PostForm def index(request): if request.method == "POST": post_form = PostForm(request.POST) if post_form.is_valid(): post = post_form.save(commit=False) post.user = request.user # 无需手动赋值date_and_time,auto_now_add会自动填充提交时间 post.save() # 建议此处添加重定向逻辑,避免用户刷新页面重复提交帖子 else: # 校验失败时传回表单对象(包含错误提示) return render(request, "network/index.html", { "form": post_form }) # GET请求初始化空表单 post_form = PostForm() return render(request, "network/index.html", { "form": post_form })
forms.py原有配置无问题,不需要修改。
3. 修复迁移异常
因为之前生成的迁移文件包含错误的字段配置,需要重新生成迁移:
- 找到network应用下
migrations文件夹,删除其中的0003_post_date_and_time.py文件(不要删除__init__.py和其他已经执行成功的历史迁移文件) - 执行命令重新生成正确的迁移文件:
python manage.py makemigrations - 执行命令完成数据库迁移:
python manage.py migrate
内容的提问来源于stack exchange,提问作者econo
相关产品推荐
相关产品推荐

