Django:提供ADMIN媒体文件

时间:2009-07-04 05:43:17

标签: django routing path media admin

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

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

  

找不到页面:   F:\ python25 \ lib中\站点包\ django的/了contrib /管理/媒体\ 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")

任何提示?

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

提前致谢:)

7 个答案:

答案 0 :(得分:32)

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

我也被这种魔法行为所灼伤。有一张这样的票(Ticket #8336),但设计决定是留下方便和混乱。

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

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/'

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

尝试

(r'^ admin_media /(.*)','django.views.static.serve',{'document_root':'django / contrib / admin / media /','show_indexes':True}),< / p> 在您的urls.py文件中

。并改变你的

ADMIN_MEDIA_PREFIX = '/admin_media/'

答案 3 :(得分:2)

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

  

确保使用尾部斜杠,并且   这有不同于   MEDIA_URL设置(因为相同的URL   无法映射到两个不同的   文件集。)

答案 4 :(得分:1)

尝试更改:

ADMIN_MEDIA_PREFIX = '/static/media/'

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

答案 5 :(得分:1)

由于staticfiles包含在trunk中(我相信大约1.3),因此不再使用ADMIN_MEDIA_PREFIX魔法。

如今,runserver假设你的STATIC_URL +'admin /'。它秘密而默默地拦截你的请求,忽略你所有的urlconf,并试图让你发疯。

答案 6 :(得分: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('\\','/')),
)

祝你好运!