由于某些图像文件存在名称冲突,我决定让系统自动更改上传文件的名称。但是,更改系统后,我在获取文件路径的当前日期时遇到了麻烦。
这就是我之前的 Image
模型的样子,它存储名称类似于 boutique/index/2018/9/20/FILE_NAME.jpg
的图像。
class Image(TimeStampedModel):
...
image = ImageField(..., upload_to='boutique/index/index/%Y/%m/%d')
...
之后我把它改成了这样。这成功地自动更改了上传图像的名称。但是,它存储的名称类似于 boutique/%Y/%m/%d/FILE_NAME.jpg
。
def image_path(instance, filename):
basefilename, file_extension = os.path.splitext(filename)
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
randomstr = ''.join((random.choice(chars)) for x in range(10))
return 'boutique/index/%Y/%m/%d/{imageid}/{basename}{randomstring}{ext}'.format(imageid=instance.store.domainKey, basename=basefilename, randomstring=randomstr, ext=file_extension)
class Image(TimeStampedModel):
...
image = ImageField(..., upload_to=image_path)
...
就像您在上面看到的那样,问题是 %Y
、%m
和 %d
不提供日期数据我不再需要了。这里有什么问题吗? image_path
函数在同一位置返回相同的内容。我不知道为什么它们就像被识别为普通字符串
最佳答案
您必须手动设置这些值。
添加导入
from datetime import datetime
并将函数中的 %Y、%m、%d 替换为 {year}、{month}、{day} 变量,并将这些值添加到格式调用中。
def image_path(instance, filename):
basefilename, file_extension = os.path.splitext(filename)
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
randomstr = ''.join((random.choice(chars)) for x in range(10))
_now = datetime.now()
return 'boutique/index/{year}/{month}/{day}/{imageid}/{basename}{randomstring}{ext}'.format(
imageid=instance.store.domainKey,
basename=basefilename, randomstring=randomstr, ext=file_extension,
year=_now.strftime('%Y'), month=_now.strftime('%m'), day=_now.strftime('%d')
)
有关 django 中文件上传的更多信息
关于django - 如何在 Django 模型中获取 upload_to 的当前日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52431806/