如何让Django Admin使用文件实际创建时间作为文件名
Django服务Admin管理端原本设计为用文件创建日期作为文件名,支持软件自动上传、用户手动上传两种文件添加方式,但用户手动添加文件时,服务始终使用Django进程启动时的时间戳命名,需要修改逻辑让系统使用文件实际创建时间戳完成命名。

涉及的原始代码如下:admin.py 原始代码:
from django.contrib import admin from .models import SyncScriptLog from django.core.management import call_command class SyncScriptLogAdmin(admin.ModelAdmin): actions = ['make_sync'] def make_sync(self, request, queryset): call_command('update_rdf_from_api', "90", int(request.POST['_selected_action'])) messages.add_message( request, messages.INFO, 'Amazing synchronization from multiple API sources to RDF TripleStore is DONE!') make_sync.short_description = "Run Sync from API to RDF" make_sync.acts_on_all = True admin.site.register(SyncScriptLog, SyncScriptLogAdmin)
models.py 原始代码:
from django.db import models from datetime import datetime class SyncScriptLog(models.Model): title = models.CharField(max_length=20, default=datetime.now().strftime("%Y-%m-%d %H:%M:%S"), editable=False) content = models.TextField() def __str__(self): return self.title
时间戳固定为进程启动时间的核心bug出在模型字段默认值定义上:default=datetime.now().strftime("%Y-%m-%d %H:%M:%S") 这段代码在Django服务启动、模型类首次被加载时就会执行完成,计算出一个固定的时间字符串后,所有后续新建、且未手动传入title值的记录,都会复用这个固定值,不会在创建记录时重新计算当前时间。
此外admin.py中调用了messages.add_message但未导入messages模块,运行时会抛出命名错误,需要一并修复。
1. 修正模型层默认值逻辑
Django字段的default参数如果需要动态生成值,必须传入可调用对象(不要加括号提前执行),禁止直接传入执行后的固定值;同时不要用lambda表达式作为默认值,否则执行数据库迁移命令时会出现序列化报错。
方案1:保留原有CharField存储格式化时间的逻辑
定义一个顶层函数生成当前时间字符串,作为字段默认值:
from django.db import models from datetime import datetime def get_current_time_title(): return datetime.now().strftime("%Y-%m-%d %H:%M:%S") class SyncScriptLog(models.Model): # default传入函数名,不要加() title = models.CharField(max_length=20, default=get_current_time_title, editable=False) content = models.TextField() def __str__(self): return self.title
方案2(更规范):使用Django内置时间字段
如果title字段本质是记录创建时间,推荐直接使用DateTimeField的auto_now_add参数,字段会在记录首次创建时自动写入当前时间,无需手动处理默认值,后续做时间筛选、排序也更方便:
from django.db import models class SyncScriptLog(models.Model): created_at = models.DateTimeField(auto_now_add=True, editable=False) content = models.TextField() def __str__(self): # 需要字符串格式时再做格式化输出 return self.created_at.strftime("%Y-%m-%d %H:%M:%S")
2. 修复admin.py导入缺失
在admin.py的导入部分补上messages模块的导入:
from django.contrib import admin from django.contrib import messages # 补充缺失的导入 from .models import SyncScriptLog from django.core.management import call_command class SyncScriptLogAdmin(admin.ModelAdmin): actions = ['make_sync'] def make_sync(self, request, queryset): call_command('update_rdf_from_api', "90", int(request.POST['_selected_action'])) messages.add_message( request, messages.INFO, 'Amazing synchronization from multiple API sources to RDF TripleStore is DONE!') make_sync.short_description = "Run Sync from API to RDF" make_sync.acts_on_all = True admin.site.register(SyncScriptLog, SyncScriptLogAdmin)
修改完成后重启Django服务,之后无论是自动脚本创建记录,还是在Admin后台手动新增记录,生成的名称都会取记录实际创建时的时间戳,不会再固定为进程启动时间。
内容的提问来源于stack exchange,提问作者Jaana

