You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:22:43