Django触发信号时如何将图片保存到自定义路径?
问题分析
直接将instance.product_image.image赋值给instance.order_image_file,本质是引用了原文件的存储路径,Django不会触发新的文件上传流程,自然不会使用你定义的order_image_upload_path生成新路径。
解决方案
需要手动读取原图片文件的内容,创建新的文件对象赋值给order_image_file,让Django执行完整的上传逻辑。修改信号代码如下:
from django.core.files.base import ContentFile import os @receiver(post_save, sender=OrderItem) def OrderItem_Signals(sender, created, instance, **kwargs): if created: if not instance.order_image_file and instance.product_image and instance.product_image.image: # 读取原图片文件内容 with open(instance.product_image.image.path, 'rb') as f: file_content = f.read() # 获取原文件名后缀 ext = os.path.splitext(instance.product_image.image.name)[1] # 生成新文件名 new_filename = f"{generate_sku()}_{instance.product_image.image.name.split('/')[-1]}" # 将内容写入新文件对象,赋值给order_image_file instance.order_image_file.save(new_filename, ContentFile(file_content), save=False) instance.save()
关键说明
- 使用
ContentFile包装原文件内容,创建新的文件对象,触发Django的上传逻辑,从而调用自定义的upload_to生成目标路径。 - 添加
save=False参数,避免保存order_image_file时再次触发post_save信号,造成循环调用。 - 增加
instance.product_image.image的存在性判断,防止原图片不存在时抛出异常。
内容的提问来源于stack exchange,提问作者boyenec
相关产品推荐
相关产品推荐

