Django 将绝对文件路径转换为相对文件路径,强制服务器从项目文件夹运行



我正在尝试创建一个网站,您可以在其中将图像添加到模型中,然后将其依次加载到主页上。但是,我注意到当我运行服务器时,它会尝试从我的/home 文件夹中获取图像。

这是我的 models.py:

image_directory = join(settings.STATICFILES_DIRS[0], "website/images")
class Item(models.Model):
image = models.FilePathField(path=image_directory, recursive=True)

这是我的家.html(我只是缩写它,项目在OK中传递:

<img src="{{ item.image }}">

我运行迁移并运行服务器,并且能够在/admin 中选择映像。图像如下所示:"sub_img_folder/img.jpg">

然后我转到/home,出现以下错误:

Not Found: /home/...absolute-path-to-project.../static/website/images/sub_img_folder/img.jpg
Not Found: /home/static/website/images/sub_img_folder/img.jpg

任何帮助将不胜感激。

编辑:这是我的一些 settings.py 内容。

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
...
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
...
MEDIA_ROOT = os.path.join(BASE_DIR + "/static/website/")
MEDIA_URL = "images/"

编辑2:澄清一下,您添加到模型的图像已经在服务器上。您只需要澄清管理页面中的哪个图像,因此FilePathField而不是FileField。尝试在主页上加载图像时,它以某种方式找不到图像,但它在管理页面中成功显示和选择。

编辑:

由于您使用的是 FilePathField,因此它仅将路径存储在磁盘上,而不是 URL。解决方案是使用模板中的MEDIA_URL来制定 URI 字符串,如下所示:

<img src="{{ MEDIA_URL }}/{{ FILE_NAME}}">

其中MEDIA_URL是来自 settings.py 的媒体 URL,FILE_NAME是文件本身的名称。

最好使用实际的ImageFieldFileField来存储您需要的所有信息,或者只是使用文件名CharField并像上面一样构建URL。

以前的答案:

尝试将 MEDIA 元素添加到你的 Django settings.py。MEDIA_ROOT和MEDIA_URL告诉 Django 如何处理用户上传的文件:

在您的 settings.py:

MEDIA_ROOT = "/path/to/media/folder"
MEDIA_URL = '/media/'

在您的 urls.py:

urlpatterns = [
.......
] += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

文档: https://docs.djangoproject.com/en/3.0/ref/settings/#media-root

最新更新