如何在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
相关产品推荐
相关产品推荐

