加入的路径位于基本路径组件之外 - 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 文件夹中。当我删除完整实例时,它还会从文件夹中删除图像文件。当我只用新文件更改实例的图像字段时,旧文件保持不变。
现在我正在开发一个自定义更新功能,其中旧图像文件被删除并替换为新图像文件。欢迎提出有关如何实现这一目标的想法!
我有一个带有 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 文件夹中。当我删除完整实例时,它还会从文件夹中删除图像文件。当我只用新文件更改实例的图像字段时,旧文件保持不变。
现在我正在开发一个自定义更新功能,其中旧图像文件被删除并替换为新图像文件。欢迎提出有关如何实现这一目标的想法!