2009-07-04 82 views
18

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

的错误,因为我试图访问本地主机:8000 /媒体/ A.GIF是如下:

Page not found: f:\python25\lib\site-packages\django/contrib/admin/media\a.gif

我把管理媒体文件名为“媒体”的目录,而我把正常的媒体名为“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的源代码)

感谢提前:)

+0

你有没有解决这个问题?我有一个与Django 1.1一起使用Mac的类似体验,服务于普通媒体文件,但不适用于管理员... – Danielb 2009-08-05 04:45:48

+0

url设置不起作用的原因是因为`django/core/management/commands/runserver。 py`和`django.core.servers.basehttp`一起为`ADMIN_MEDIA_PREFIX`设置了一个WSGI处理程序。它处理请求之前URLconf命中 – vdboor 2012-04-06 12:05:48

回答

1

尝试改变:

ADMIN_MEDIA_PREFIX = '/static/media/'

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

+0

感谢您的答案,但它仍然无法工作:) 我在broswer url中输入http:// localhost:8000/static/media/a.gif,结果是: 未找到页面:f:\ python25 \ lib \ site-packages \ django/contrib/admin/media \ a.gif – 2009-07-05 14:51:05

+0

我想我会尝试使用传统的管理员媒体示例重新创建项目:)感谢您的答案 – 2009-07-05 14:53:43

2

尝试

(R '^ admin_media /(.*)', 'django.views.static.serve',{ 'DOCUMENT_ROOT': 'django的/了contrib /管理/媒体/', 'show_indexes' :True}),

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

ADMIN_MEDIA_PREFIX = '/admin_media/' 
+0

感谢您的答案,但它仍然无法正常工作:)我在broswer网址输入http:// localhost:8000/admin_media/a.gif,结果是: Page not found: f:\ python25 \ lib \ site-packages \ django/contrib/admin/media \ a.gif – 2009-07-05 14:51:59

2

我刚刚在我的测试网站修复了一个类似的错误。 ADMIN_MEDIA_PREFIX和MEDIA_URL绝不应该是相同的,请参阅docs以下注意事项:

Make sure to use a trailing slash, and to have this be different from the MEDIA_URL setting (since the same URL cannot be mapped onto two different sets of files).

32

你的答案是,除非ADMIN_MEDIA_PREFIX明确设置一个域 的runserver命令将从contrib.admin发球出管理媒体文件。

我被这个魔法烧掉了。有这张票(Ticket #8336),但设计决定是为了保持方便和困惑。

所以提供给您的管理员媒体(使用你想使用格拉佩利或任何管理皮肤)从您的目录,你必须使用类似的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/' 

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

+0

谢谢,我也烧了这个 – orwellian 2009-11-02 00:12:09

+0

完美。谢谢你。 – 2010-05-05 13:30:43

1

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

现在,runserver假定你的STATIC_URL +'admin /'。它秘密地,默默地拦截你的请求,忽略所有你的urlconf,并且试图让你发疯。

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('\\','/')), 
) 

有一个好运!