Django cookiecutter media/место для тестирования

Проблема: у меня есть поле ImageField в модели. TestCase не может найти файл изображения по умолчанию, чтобы выполнить изменение размера изображения (декоратор @receiver(pre_save, sender=UserProfile))

class UserProfile(Model):
    user = ForeignKey(AUTH_USER_MODEL ...)
    ...
    photo = ImageField(
        verbose_name=_("Photo"),
        upload_to="media",
        null=True,
        blank=True,
        help_text=_("a photo will spark recognition from others."),
        default="default.png")

Обзор: Я запускаю тесты локально из pycharm в docker-контейнер. Этот проект основан на проекте django cookiecutter.

Я выполнил поиск целевого файла в хуке presave и файл был найден в этих 2 каталогах ['/app/media/default.png', '/opt/project/media/default.png']

Я получаю ошибку FileNotFound на '/app/<my_project_name>/media/default.png'

Как заставить медиафайл искать в этих каталогах?

@receiver(pre_save, sender=UserProfile)
def user_profile_face_photo_reduction(sender, instance, *args, **kwargs):
    """
    This creates the thumbnail photo for a concept
    """

    test_image_size(instance) # this is the function that gives problems.  it's below.
    im = generic_resize_image(size=face_dimensions, image=instance.photo)
    save_images_as_filename(
        filename=Path(instance.photo.path).with_suffix(".png"),
        image=im,
        instance=instance,
    ) 


def test_image_size(instance=None, size_limit=None):
    """
    size_limit is a namedtuple with a height and width that is too large to save.
    instance needs to have a photo attribute to work
    """
    if instance and instance.photo:
        print([x.absolute() for x in sorted(Path("/").rglob("default.png"))]) # this is where I got the actual location info
        assert instance.photo.size <= 10_000_000, ValueError("Image size is too big") # THE PROBLEM LINE IS THIS ONE.
        if (
            instance.photo.width > size_limit.width
            or instance.photo.height > size_limit.height
        ):
            raise ValueError(_("the picture dimensions are too big"))
  1. Вы подключили медиа-тома хост-машины к dockerfile? Вам может понадобиться показать нам dockerfile, чтобы мы могли лучше понять вашу конфигурацию.

    .
  2. Если запуск тестов с использованием папки непосредственно на хост-машине не является жестким требованием, вы можете создать еще одну папку в корневой папке вашего проекта Django (например, "testmedia"). В вашем файле tests.py вы можете переопределить настройки корня медиа для ваших тестов, чтобы использовать папку "testmedia". Поместите файл изображения вашего теста в эту папку. Вот пример переопределения настроек корня мультимедиа:

    TEST_DIR = os.path.join(settings.BASE_DIR, 'testmedia/') #Defines test media root
    
    @override_settings(MEDIA_ROOT=(TEST_DIR))
    def test_create_blogpost(self):
     print("\nTesting blog post creation...")
    
     testUser = User.objects.create_user(username='testUser', password='12345') #Creates test user
     self.client.login(username='testuser', password='12345') #Logs in testUser
    
     PNGtestpic = SimpleUploadedFile(name="pngtest.png", content=open(settings.MEDIA_ROOT + "pngtest.png", 'rb').read(), content_type='image/png') #Uploads test picture to media root
     Blogpost.objects.create(title="How to run tests", cover_image= PNGtestpic, author=testUser)
    

Надеюсь, это поможет!

Я начал с создания каталога "media" в папке app_root (/Users//<project_name>/). Это был глупый шаг. В папке (/Users//<project_name>/<project_name>/media) уже есть папка media, которую я не видел. Я пытался заставить ее, используя такие трюки, как трюк с монтированием docker и изменение моего кода, но это была пустая трата времени.

Я проголосовал за ответ @heyylateef за override_settings, потому что это аккуратный декоратор.

Вернуться на верх