图像路径的 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。