一尘不染

Django中的动态文件路径

django

我正在尝试在Django中生成动态文件路径。我想制作一个像这样的文件系统:

 -- user_12
     --- photo_1
     --- photo_2
 --- user_ 13
     ---- photo_1

我发现了一个相关的问题:具有动态路径的Django自定义图像上传字段

在这里,他们说我们可以更改upload_to路径,并指向https://docs.djangoproject.com/en/stable/topics/files/ doc。在文档中,有一个示例:

from django.db import models
from django.core.files.storage import FileSystemStorage

fs = FileSystemStorage(location='/media/photos')

class Car(models.Model):
    ...
    photo = models.ImageField(storage=fs)

但是,这仍然不是动态的,我想给Car id赋予图像名称,并且在Car定义完成之前我无法分配ID。那么如何创建带有汽车ID的路径?


阅读 552

收藏
2020-03-26

共1个答案

一尘不染

你可以在upload_to参数中使用callable 而不是使用自定义存储。请参阅docs,并注意那里的警告,即在调用函数时可能尚未设置主键(因为可能在将对象保存到数据库之前处理了上载),因此ID可能无法使用。你可能希望考虑在模型上使用其他字段,例如slug。例如:

import os
def get_upload_path(instance, filename):
    return os.path.join(
      "user_%d" % instance.owner.id, "car_%s" % instance.slug, filename)

然后:

photo = models.ImageField(upload_to=get_upload_path)
2020-03-26