使用 Django ImageField 中的 id 在上传时更改文件名

Jos*_*gel 1 django imagefield

在这个模型中,我想更改 ImageField 中上传的文件的名称

class Product(models.Model):
    image = models.ImageField(upload_to=content_file_name)
    name = models.CharField(max_length=100)
    amount = models.PositiveIntegerField()

    class Meta:
        ordering = ('name',)

    def __str__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

要更改图像的名称,我正在使用此功能

def content_file_name(instance, filename):
    ext = filename.split('.')[-1]
    filename = '%s.%s' % (instance.id, ext)

    return os.path.join('products', filename)
Run Code Online (Sandbox Code Playgroud)

但是我的图像的名称是无,如果我使用其他字段,如“名称”,则它有效。我应该怎么做才能更改带有 id 的名称?谢谢!

C14*_*14L 5

实例id尚未创建,因为该upload_to函数在新对象首次写入数据库之前被调用。

在大多数情况下,这个对象还没有被保存到数据库中,所以如果它使用默认的 AutoField,它的主键字段可能还没有值。

来自Django 文档的强调

两种选择:

使用一个uuid.uuid4()值,它很容易创建并且与pk.

另一个建议,如果您关心搜索引擎和 SEO,请使用 aslugify(instance.name)以便在搜索引擎的图像搜索中更容易找到您的图像。