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
相关产品推荐
相关产品推荐

