19

我已经成功地为普通的 MEDIA 文件提供媒体文件,但是当我尝试提供管理媒体文件时,我失败了。请帮我找出问题所在,因为我已经尝试解决问题几个小时了,但没有运气(也一直在谷歌搜索并阅读了关于提供静态文件的 django 文档)。

我尝试访问 localhost:8000/media/a.gif 的错误如下:

找不到页面:f:\python25\lib\site-packages\django/contrib/admin/media\a.gif

我将管理媒体文件放在名为“media”的目录中,而将普通媒体文件放在名为“static”的目录中。我也在Windows上。

以下是我在 urls.py 中提供普通媒体文件的方式:

# serve static files
from django.conf import settings
if settings.ENVIRONMENT==settings.ENV_DEVELOPMENT:
    urlpatterns += patterns("django.views",
        url(r"%s(?P<path>.*)$" % settings.MEDIA_URL[1:], "static.serve", {"document_root": settings.MEDIA_ROOT,})
    )

还有我的 settings.py (只有重要的部分):

import project_path
MEDIA_ROOT = project_path.MEDIA.replace('\\','/')
MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/media/'
TEMPLATE_DIRS = (
    project_path.TEMPLATE.replace('\\','/'),
)

还有我的 project_path.py:

import sys
from os.path import dirname, join
ROOT = dirname(__file__)
APP = join(ROOT, "apps")
TEMPLATE = join(ROOT, "templates")
MEDIA = join(ROOT, "static")
ADMIN_MEDIA = join(ROOT, "media")

有什么提示吗?

或者至少请分享您如何提供您的管理媒体文件(不更改来自网络服务器的任何文件,但只能通过 django 源代码)

提前致谢 :)

4

7 回答 7

32

您的答案是,除非ADMIN_MEDIA_PREFIX明确设置域,否则 runserver 命令将从 contrib.admin 提供管理媒体文件。

我也被这种神奇的行为烧伤了。有一张票(票#8336),但设计决定是保留便利和混乱。

因此,要使用以下命令从您的目录中提供您的管理媒体(用于使用 grappelli 或任何您想使用的管理皮肤),您必须使用以下runserver命令:

MEDIA_ROOT =  os.path.join(PROJECT_ROOT, 'media/')
ADMIN_MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'admin-media/')
MEDIA_URL = '/site-media/'
ADMIN_MEDIA_PREFIX = 'http:/localhost:8000/admin-media/'

我希望我在这里复活了正确的问题。提前道歉。

于 2009-11-01T10:28:37.227 回答
3

建议运行开发服务器有点不同 [1] python manage.py runserver mydomain.com:8000 --adminmedia=/path/to/your/admin/media/

[1] http://code.google.com/p/django-grappelli/wiki/Installation

于 2010-01-24T13:14:39.657 回答
2

尝试

(r'^admin_media/(.*)', 'django.views.static.serve', {'document_root' : 'django/contrib/admin/media/', 'show_indexes' : True}),

在您的 urls.py 文件中。并改变你的

ADMIN_MEDIA_PREFIX = '/admin_media/'
于 2009-07-04T07:40:30.590 回答
2

我刚刚在我的测试站点中修复了一个类似的错误。ADMIN_MEDIA_PREFIX 和 MEDIA_URL 永远不应相同,请参阅文档中的以下注释:

确保使用尾部斜杠,并使其与 MEDIA_URL 设置不同(因为相同的 URL 不能映射到两组不同的文件)。

于 2009-08-05T05:00:58.483 回答
1

由于静态文件包含在主干中(我相信大约是 1.3),因此不再使用 ADMIN_MEDIA_PREFIX 魔法。

如今,runserver 假定您的 STATIC_URL + 'admin/'。它偷偷地、默默地拦截你的请求,忽略你所有的urlconf,并试图让你发疯。

于 2011-11-02T00:39:17.343 回答
1

尝试改变:

ADMIN_MEDIA_PREFIX = '/static/media/'

这假设您的 MEDIA_ROOT/media/ 目录包含管理媒体文件夹(这是我从您的问题中理解的)。

于 2009-07-04T07:04:56.073 回答
0

尝试使用 STATICFILES_DIRS 作为打击

# Additional locations of static files
STATICFILES_DIRS = (
    # Put strings here, like "/home/html/static" or "C:/www/django/static".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    ("images", os.path.join(STATIC_ROOT,'images').replace('\\','/')),
    ("css",    os.path.join(STATIC_ROOT,'css').replace('\\','/')),
    ("js",     os.path.join(STATIC_ROOT,'js').replace('\\','/')),
)

祝你好运!

于 2011-11-10T08:13:13.457 回答