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

Django Cookiecutter项目测试环境ImageField默认图片路径NotFound问题

问题根因

ImageField计算文件路径的逻辑是 MEDIA_ROOT配置 + 字段default/upload_to配置 拼接得到最终的文件绝对路径,你报错的/app/<my_project_name>/media/default.png就是当前配置拼接后的结果,和实际default.png存放的/app/media/、/opt/project/media/路径不匹配,所以触发FileNotFound错误。

解决方案(按优先级推荐)

1. 调整测试环境的MEDIA_ROOT配置(最规范)

Django Cookiecutter模板默认会拆分多环境配置,你直接修改**测试专用的配置文件(一般为config/settings/test.py)**即可:

from pathlib import Path

# 直接指向容器内实际存在default.png的目录即可
MEDIA_ROOT = Path("/app/media/")

# 如果需要兼容本地Pycharm映射和容器运行,也可以用环境变量动态控制:
# import os
# MEDIA_ROOT = Path(os.getenv("DJANGO_MEDIA_ROOT", "/app/media/"))

配置后可以在测试代码中加入一行打印验证配置是否生效:

from django.conf import settings
print("当前MEDIA_ROOT:", settings.MEDIA_ROOT)

2. 测试用例中使用临时图片(符合单元测试无依赖原则)

如果不想修改配置,也可以在测试用例中手动生成临时测试图片,避免依赖项目自带的默认图片,也不会触发路径匹配问题:

from django.test import TestCase
from django.core.files.uploadedfile import SimpleUploadedFile
from PIL import Image
import io

class UserProfileTestCase(TestCase):
    def setUp(self):
        # 生成100*100的临时PNG图片
        test_img = Image.new("RGB", (100, 100), color="white")
        img_buffer = io.BytesIO()
        test_img.save(img_buffer, format="PNG")
        img_buffer.seek(0)
        self.test_photo = SimpleUploadedFile(
            "test.png", 
            img_buffer.read(), 
            content_type="image/png"
        )

    def test_pre_save_logic(self):
        # 创建实例时手动传入临时图片,覆盖默认值
        profile = UserProfile.objects.create(
            user=你的测试用户实例,
            photo=self.test_photo
        )
        # 后续测试逻辑

3. 临时兼容方案(不推荐长期使用)

如果只是需要快速跑通测试,可以直接把ImageField的default值改成绝对路径:

photo = ImageField(
    verbose_name=_("Photo"),
    upload_to="media",
    null=True,
    blank=True,
    help_text=_("a photo will spark recognition from others."),
    default="/app/media/default.png" # 直接写实际文件的绝对路径
)

内容的提问来源于stack exchange,提问作者Back2Basics

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:45:04