图像路径的 FilePathField 不适用于 Django 管理面板
FilePathField for Image Path not working with Django Admin Panel
Django 和一般 Web 开发的新手。但是我已经按照 tutorial 创建了我的第一个站点。一切正常,直到我完成它并想使用 Django 管理面板编辑信息。
主要问题是我有一个如下所示的模型,它使用 FilePathField 来描述图像位置。教程让我将图像放在 /home/pi/mysite/projects/static/img
.
中
from django.db import models
class Project(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
technology = models.CharField(max_length=20)
image = models.FilePathField('/img')
def __str__(self):
return self.title #or self.title for blog posts
起初在网站上显示图像时效果很好,但是当我尝试从管理面板导航到 /change/
url 时,我会得到 FileNotFoundError at /admin/projects/project/1/change/ [Errno 2] No such file or directory: '/img'
所以我环顾四周,发现 FilePathField 是一个绝对路径,所以尝试用 /home/pi/mysite/projects/static/img/
绝对定义它。这阻止了错误的发生,让我至少可以从管理面板访问 /change/
url。面板现在显示带有下拉菜单的图像字段,我可以使用它在我在那里的不同图像之间进行选择,这些图像位于 /home/pi/mysite/projects/static/img/
。但是在管理面板上,一旦我点击保存,图像将不再显示在网站上。在网站上使用 inspect element 后,它似乎试图从 /static/projects/static/img
中提取图像。然后我尝试将图像移动到 /static/projects/static/img
,但它们不再出现在管理面板的下拉框中,也没有显示在网站上。
所以在这一点上我只是有点困惑我应该把 FilePathField 指向哪里,这样我就可以在网站上显示图像并通过管理面板更改它们。
更好的方法是像这样使用 django 的 FileField
:
image = models.FileField(null=True, blank=True)
在您的 settings.py
中,您需要包含媒体路径。检查你的设置中是否有这个。
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\', '/')
MEDIA_URL = '/media/'
最后一步是扩展 urls.py 中的 url 模式:
urlpatterns = [
# your paths
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
这将生成一个 /media/
目录,您上传的媒体文件将指向该目录。然后在你的前端,你可以简单地使用模型 属性 image.url
来获得图像的绝对值 url。
Django 和一般 Web 开发的新手。但是我已经按照 tutorial 创建了我的第一个站点。一切正常,直到我完成它并想使用 Django 管理面板编辑信息。
主要问题是我有一个如下所示的模型,它使用 FilePathField 来描述图像位置。教程让我将图像放在 /home/pi/mysite/projects/static/img
.
from django.db import models
class Project(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
technology = models.CharField(max_length=20)
image = models.FilePathField('/img')
def __str__(self):
return self.title #or self.title for blog posts
起初在网站上显示图像时效果很好,但是当我尝试从管理面板导航到 /change/
url 时,我会得到 FileNotFoundError at /admin/projects/project/1/change/ [Errno 2] No such file or directory: '/img'
所以我环顾四周,发现 FilePathField 是一个绝对路径,所以尝试用 /home/pi/mysite/projects/static/img/
绝对定义它。这阻止了错误的发生,让我至少可以从管理面板访问 /change/
url。面板现在显示带有下拉菜单的图像字段,我可以使用它在我在那里的不同图像之间进行选择,这些图像位于 /home/pi/mysite/projects/static/img/
。但是在管理面板上,一旦我点击保存,图像将不再显示在网站上。在网站上使用 inspect element 后,它似乎试图从 /static/projects/static/img
中提取图像。然后我尝试将图像移动到 /static/projects/static/img
,但它们不再出现在管理面板的下拉框中,也没有显示在网站上。
所以在这一点上我只是有点困惑我应该把 FilePathField 指向哪里,这样我就可以在网站上显示图像并通过管理面板更改它们。
更好的方法是像这样使用 django 的 FileField
:
image = models.FileField(null=True, blank=True)
在您的 settings.py
中,您需要包含媒体路径。检查你的设置中是否有这个。
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\', '/')
MEDIA_URL = '/media/'
最后一步是扩展 urls.py 中的 url 模式:
urlpatterns = [
# your paths
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
这将生成一个 /media/
目录,您上传的媒体文件将指向该目录。然后在你的前端,你可以简单地使用模型 属性 image.url
来获得图像的绝对值 url。