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

如何在Django模型的上传路径函数中正确生成年月日目录?

解决Django upload_to路径生成符合YYYY/M/D格式的问题

首先,问题出在你直接在f-string里使用了%y/%m/%d这类strftime格式符号——f-string并不解析这些符号,它们会被当作普通字符直接输出,导致生成的路径里包含%y、%m而不是实际的日期数值。同时,你需要的四位年份对应的格式符号是%Y(而不是%y,它只会生成两位年份,比如19而不是2019)。

正确的修改方式

我们需要借助Python的datetime模块来生成符合要求的日期格式字符串,再插入到路径中。

首先导入datetime模块:

from datetime import datetime

然后修改你的两个路径生成函数:

def author_document_path(instance, filename):
    # 获取当前日期,格式化为「四位年份/月份/日期」(如2019/5/30)
    date_segment = datetime.now().strftime("%Y/%m/%d")
    return f"documents/{instance.author.username}/{date_segment}/{filename}"

def author_blog_images(instance, filename):
    date_segment = datetime.now().strftime("%Y/%m/%d")
    return f"blog-images/{instance.author.username}/{date_segment}/{filename}"

可选优化:使用文章的创建日期而非上传日期

如果你的Blog模型有类似created_at的时间字段(记录文章创建时间),你也可以用这个时间来生成路径,这样更贴合文章的生命周期:

def author_blog_images(instance, filename):
    # 假设Blog模型有created_at字段,用它的日期来生成路径
    date_segment = instance.created_at.strftime("%Y/%m/%d")
    return f"blog-images/{instance.author.username}/{date_segment}/{filename}"

格式符号说明

  • %Y:四位数字的年份(如2019)
  • %m:两位数字的月份(如05),如果想要单个数字的月份(如5),可以用%-m(Unix系统)或%#m(Windows系统),不过跨平台的话推荐保持两位数字格式,避免路径不一致问题
  • %d:两位数字的日期(如30),同理,单个数字日期用%-d/%#d

这样修改后,上传文件时就会生成你期望的documents/用户名/2019/5/30/文件名这类目录结构了。

内容的提问来源于stack exchange,提问作者Mir Stephen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:47:27