【问题标题】:Django model field to image in static folderDjango模型字段到静态文件夹中的图像
【发布时间】:2020-02-04 17:59:59
【问题描述】:

我正在尝试制作一个游戏的 Django 模型,其中包含名称字段以及位于应用程序静态文件夹中的封面图像。

def game_covers_path():
    return os.path.join(settings.STATIC_URL, 'some_app/games/')


class Game(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
    cover = models.FilePathField(path=game_covers_path, null=True)

    def __str__(self):
        return self.name

我的文件夹结构如下:

.
├── db.sqlite3
├── my_app
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── some_app
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    ├── models.py
    ├── static
    │   └── some_app
    │       ├── games
    │       │   ├── Counterstrike:\ Global\ Offensive.jpg
    ├── templates
    ├── tests.py
    ├── urls.py
    └── views.py

但是当我打开管理页面时,我收到以下错误:

FileNotFoundError at /admin/some_app/game/add/
[Errno 2] No such file or directory: '/static/some_app/games/'

如何正确引用数据库中应用的静态文件夹中的图像? FilePathField 是否在保存模型之前检查文件是否存在?因为我尝试添加随机值并保存了它,但在文档中写到你只能选择一个已经存在的文件......

【问题讨论】:

    标签: python django


    【解决方案1】:

    (评论太长)

    1. STATIC_URL 是一个 URL,它会在运行时被 Django 映射到 STATIC_ROOT path,所以使用 STATIC_ROOT 来构建文件 path

    2. 静态文件不应该被动态修改:css、js、favicon;您正在尝试做的是在 Django 中称为 media 文件,因此请改用 MEDIA_URL,MEDIA_ROOT。另请注意,static 文件可以存储在项目文件夹中,而 media 文件通常存储在其他位置。它们不是您的项目/解决方案的一部分 - 它们是数据

    3. 要正确处理静态文件和媒体文件,您必须配置 STATIC_ROOT、STATIC_URL、MEDIA_ROOT、MEDIA_URL

    这里有几十个关于 Django 静态和媒体文件的问题和答案,请看一下。请看the docs

    【讨论】:

    • 我不需要动态修改的文件,所以根据我在文档中的理解,我应该设置 STATIC_ROOT 然后运行 ​​collectstatic 但我需要 apache 进行本地开发吗?
    • 不,本地开发不需要apache。
    • 好的,所以它适用于管理页面,但图片在网页中不可见(它找不到'localhost:8000/STATIC_ROOT...')
    猜你喜欢
    • 2022-12-21
    • 2018-03-18
    • 2018-05-23
    • 1970-01-01
    • 2021-03-30
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多