加入的路径位于基本路径组件之外 - Django 图片上传

The joined path is located outside of the base path component - Django image upload

我有一个带有 ImageField 的模型。我想将图像上传到文件夹 media/item_image。之后我希望能够从项目中删除图像,以及 item_image 文件夹中的图像文件。我能够通过更改 settings.py 文件中的媒体根目录来上传图像,但我认为这破坏了我的删除功能。此外,它没有按预期将图像上传到正确的文件夹中。

现在我正在尝试相反的方法,但出现以下错误:

“加入的路径位于基本路径组件之外”

settings.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'

models.py

class Item(models.Model):
    item_image = models.ImageField(upload_to='item_image', null=True, blank=True)

    def delete(self, *args, **kwargs):
        item = Item.objects.all()
        for i in item:
            i.delete()

        os.remove(os.path.join(settings.MEDIA_ROOT, self.item_image.name))
        super(Item, self).delete(*args, **kwargs)

我对如何以正确的方式处理这个问题有点困惑。是因为我更新的是 Item 实例而不是删除实例吗?有人知道吗?

修复了删除方法,确实是因为我的自定义删除功能是基于删除整个项目实例。

settings.py -- 在 MEDIA_URL 之后定义 MEDIA_ROOT 像这样:

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

models.py -- 从设置中添加 MEDIA_ROOT 并将文件夹 item_image 加入其中。从删除函数 os.remove 中删除了 settings.MEDIA_ROOT 和加入路径,如下所示:

class Item(models.Model):
    item_image = models.ImageField(upload_to=settings.MEDIA_ROOT + '/item_image', null=True, blank=True)
    
    def delete(self, *args, **kwargs):
        items = Item.objects.all()
        items.delete()
        
            try: 
              os.remove(self.item_image.name)
              super(Item, self).delete(*args, **kwargs)
            except FileNotFoundError: 
              pass

现在,当我添加图像时,它被正确地放置在 media/item_image 文件夹中。当我删除完整实例时,它还会从文件夹中删除图像文件。当我只用新文件更改实例的图像字段时,旧文件保持不变。

现在我正在开发一个自定义更新功能,其中旧图像文件被删除并替换为新图像文件。欢迎提出有关如何实现这一目标的想法!