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

时间:2016-06-15 15:03:25

标签: 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

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

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

    return os.path.join('products', filename)

但是我的图片名称是None,如果我使用其他字段如'name',它就可以了。我该怎么做才能用id更改名称?谢谢!

1 个答案:

答案 0 :(得分:3)

尚未创建实例的id,因为在首次将新对象写入数据库之前,upload_to函数被称为

  

在大多数情况下,此对象尚未保存到数据库中,因此如果它使用默认的AutoField,则可能还没有其主键字段的值。

来自Django docs

的重点

两种选择:

使用uuid.uuid4()值,它易于创建且与pk一样独特。

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