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

如何让Django Admin使用文件实际创建时间作为文件名

问题描述

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

Admin后台操作界面截图

涉及的原始代码如下:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:45:37