Djang中的动态文件路径

2024-06-07 04:56:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在django中生成动态文件路径。我想创建这样的文件系统:

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

我发现了一个相关的问题:Django Custom image upload field with dynamic path

在这里,他们说我们可以将upload_改为path并指向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)

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


Tags: pathdjangofromimport路径models动态storage
1条回答
网友
1楼 · 发布于 2024-06-07 04:56:13

您可以在upload_to参数中使用callable,而不是使用自定义存储。请参见docs,并注意其中的警告,即调用函数时可能尚未设置主键(因为在将对象保存到数据库之前可能会处理上载),因此可能无法使用ID。你可以考虑在模型上使用另一个字段,比如slug。E、 克:

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)
网友
2楼 · 发布于 2024-06-07 04:56:13

您可以使用lambda函数,如下所示,请注意,如果实例是新的,则它将没有实例id,因此请使用其他函数:

logo = models.ImageField(upload_to=lambda instance, filename: 'directory/images/{0}/{1}'.format(instance.owner.id, filename))
网友
3楼 · 发布于 2024-06-07 04:56:13

https://docs.djangoproject.com/en/stable/ref/models/fields/#django.db.models.FileField.upload_to

def upload_path_handler(instance, filename):
    return "user_{id}/{file}".format(id=instance.user.id, file=filename)

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

文档中有一个警告,但它不应该影响您,因为我们是在UserID之后,而不是CarID之后

In most cases, this object will not have been saved to the database yet, so if it uses the default AutoField, it might not yet have a value for its primary key field.

相关问题 更多 >