Django ImageField:直接使用磁盘中的文件
Django ImageField: directly using file from disk
我的磁盘上有一个文件,说:
/home/user/file.png
我有一个带有 StdImageField
的模型(类似于 ImageField,只是一些额外的选项),more here。
models.py:
class MyModel(models.Model):
image = StdImageField(upload_to="images", variations={"thumbnail": (600,400), "normal": (1000, 600)}, blank=True, null=True)
我想做的是以编程方式“上传”这张图片。我 而不是 只是想将现有路径分配给该字段,因为我希望图像存储在正确的文件夹中并适当调整大小。
所以假设我在变量 obj
中有一个模型实例,然后我尝试执行以下操作:
from django.core.files.images import ImageFile
open_file = open("/home/user/file.png", "rb")
django_file = ImageFile(open_file)
obj.image = django_file
obj.save()
乍一看效果很好,因为 a) 我的图像被移动到我的媒体根目录中的正确文件夹 images
,并且 b) 图像被正确调整大小。但是,在此操作之后,带有文件路径的数据库字段变为绝对路径,包含媒体根目录的完整路径:
/src/media/images/file.png
但这不是它通常的工作方式 -- 这应该是相对的并且只包含:
images/file.png
为什么会变成绝对域,如何解决?
使用uploadedfile
--(Django doc)class作为
<b>from django.core.files.uploadedfile import UploadedFile</b>
instance = MyModel(
image=<b>UploadedFile(
file=open("/home/user/path/to/file/foo.jpg", 'rb')
)</b>
)
instance.save()
结果
我的磁盘上有一个文件,说:
/home/user/file.png
我有一个带有 StdImageField
的模型(类似于 ImageField,只是一些额外的选项),more here。
models.py:
class MyModel(models.Model):
image = StdImageField(upload_to="images", variations={"thumbnail": (600,400), "normal": (1000, 600)}, blank=True, null=True)
我想做的是以编程方式“上传”这张图片。我 而不是 只是想将现有路径分配给该字段,因为我希望图像存储在正确的文件夹中并适当调整大小。
所以假设我在变量 obj
中有一个模型实例,然后我尝试执行以下操作:
from django.core.files.images import ImageFile
open_file = open("/home/user/file.png", "rb")
django_file = ImageFile(open_file)
obj.image = django_file
obj.save()
乍一看效果很好,因为 a) 我的图像被移动到我的媒体根目录中的正确文件夹 images
,并且 b) 图像被正确调整大小。但是,在此操作之后,带有文件路径的数据库字段变为绝对路径,包含媒体根目录的完整路径:
/src/media/images/file.png
但这不是它通常的工作方式 -- 这应该是相对的并且只包含:
images/file.png
为什么会变成绝对域,如何解决?
使用uploadedfile
--(Django doc)class作为
<b>from django.core.files.uploadedfile import UploadedFile</b>
instance = MyModel(
image=<b>UploadedFile(
file=open("/home/user/path/to/file/foo.jpg", 'rb')
)</b>
)
instance.save()
结果