Django ImageField上载位置的文件名可以是什么?

Django ImageField上载位置的文件名可以是什么?,django,django-models,Django,Django Models,每当我用Cloth\u image创建Cloth模型时,图像就会上传到upload\u位置 我的问题是instance.id返回None,因为实例尚未创建ImageField的最佳上传位置是什么? def upload_location(instance, filename): new_id = instance.id ext = filename.split('.')[-1] return "clothes/%s/%s.%s" % (instance.user.id,

每当我用
Cloth\u image
创建
Cloth
模型时,图像就会上传到
upload\u位置

我的问题是
instance.id
返回
None
,因为实例尚未创建ImageField的最佳上传位置是什么?

def upload_location(instance, filename):
    new_id = instance.id
    ext = filename.split('.')[-1]
    return "clothes/%s/%s.%s" % (instance.user.id, new_id, ext) #  <- Right Here!

class Cloth(models.Model):
    cloth_image = models.ImageField(upload_to=upload_location,
                                null=True,
                                blank=True)
def上传位置(实例、文件名):
new_id=instance.id
ext=filename.split('.')[-1]

返回“costs/%s/%s.%s”%(instance.user.id,new#id,ext)#只需使用文件名而不使用id,例如

os.path.join('clothes', instance.user.id, filename)

如果文件名已经存在,不用担心,Django会自动在末尾添加随机字符串,以避免文件替换。

如果您想要唯一的文件名,我想您可以使用
uuid

import uuid
import os

def get_file_path(instance, filename):
    base_dir = 'clothes'
    user.id = str(instance.user.id)
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    return os.path.join(base_dir, user_id, filename)

我喜欢这个主意。如果uuid.uuid4()生成了以前的id怎么办?他们是否将以前生成的id存储到某个地方?如果不是,它只是一个随机整数,不是吗?这是一个基于许多参数的复合字段,你可以读取更多的嗯。。确切地我想为图像文件名生成真正的唯一id:(nvm uuid在生成随机文件名方面是非常合法的。很酷的东西!感谢您的帮助)