Django DateTimeField作为主键删除时触发格式验证错误求解
解决方案
以下是3种可行的修复方案,可根据自身项目情况选择:
方案1:覆盖删除确认模板(对现有业务影响最小)
问题根源是删除确认页输出主键时直接使用了本地化后的时间字符串,你只需要自定义Django Admin的删除确认模板,将主键输出为标准ISO时间格式即可:
- 在你的项目
templates目录下创建层级目录admin/,新增文件delete_selected_confirmation.html - 复制Django原生模板的全部内容,仅修改隐藏域的value属性:
<!-- 将原来的写法 --> <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}"> <!-- 修改为 --> <input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|date:"c" }}">
date:"c" 过滤器会直接输出符合Django校验要求的ISO 8601格式时间,不会出现格式不匹配问题。
方案2:关闭Admin中DateTime字段的本地化
如果你不需要在Admin中展示本地化格式的时间,可以直接在对应的ModelAdmin中关闭DateTime字段的本地化配置:
from django.contrib import admin from django.db.models import DateTimeField from .models import YourModel class YourModelAdmin(admin.ModelAdmin): formfield_overrides = { DateTimeField: {"localize": False}, } admin.site.register(YourModel, YourModelAdmin)
该方案会让Admin所有位置的DateTime字段都使用标准格式展示,同时也会解决删除时的格式错误问题。
方案3:调整主键设计(长期最优方案)
业务字段作为主键本身就容易引发序列化、关联查询、数据迁移等多类问题,建议你新增自增ID作为主键,将timestamp字段改为唯一约束:
# 调整后的字段定义 id = models.AutoField(primary_key=True) timestamp = models.DateTimeField(unique=True)
调整后彻底避免了时间格式转换对主键查询的影响,是长期来看最稳妥的解决方案。
内容的提问来源于stack exchange,提问作者aikipooh
相关产品推荐
相关产品推荐

