django 中媒体文件的正确路径/url
Posted
技术标签:
【中文标题】django 中媒体文件的正确路径/url【英文标题】:Correct path/url for media files in django 【发布时间】:2013-09-01 04:52:14 【问题描述】:我正在使用 django 1.5.2,我很难理解媒体目录与静态目录的用途以及如何在我的 django 项目中包含样式表。
这是我的目录结构:
django_books
beer
__init__.py
admin.py
models.py
views.py
random_book
(same as beer above)
django_books (the actual django project; beer and random_book above are my apps)
templates
base.html
beersall.html
__init__.py
settings.py
urls.py
views.py
wsgi.py
static
css
beers.css
media
css
beers.css
static
css
beers.css
manage.py
我的 beersall.html 模板(啤酒输出是正确的,所以只是链接样式表是错误的):
% extends 'base.html' %
% block content %
<div id="beer_list">
% for beer in beers %
beer ,
% endfor %
</div>
% endblock %
我的 base.html 文件:
<html>
<head>
<link rel="stylesheet" type="text/css" href="/media/css/beers.css" />
<link rel="stylesheet" type="text/css" href=" STATIC_URL css/beers.css" />
<link rel="stylesheet" type="text/css" href=" MEDIA_URL css/beers.css" />
<link rel="stylesheet" type="text/css" href="/static/css/beers.css" />
<link rel="stylesheet" type="text/css" href="/Users/username/Projects/django_books/media/beers.css" />
<link rel="stylesheet" type="text/css" href="/Users/username/Projects/django_books/static/beers.css" />
<link rel="stylesheet" type="text/css" href="/Users/username/Projects/django_books/django_books/static/beers.css" />
% block extrahead %% endblock %
</head>
<body>
<div id="page_container">
% block content %
% endblock %
</div>
</body>
</html>
我的 settings.py 文件:
MEDIA_ROOT = '/Users/username/Projects/django_books/media/'
MEDIA_URL = '/Users/username/Projects/django_books/media/'
STATIC_ROOT = ''
STATIC_URL = '/static/'
我应该注意我使用的是 django 开发服务器,而不是 apache。
我的浏览器(开发者控制台)中的错误是 beers.css
是 404。
url 是localhost:8000/beers/
,我的 urls.py 文件正确地指向这个,views.py 正确地为 beersall.html 模板提供服务。如何正确链接我的媒体?
编辑
当我将 css 链接 href 值更改为 /Users/username/Projects/django_books/media/
时,它仍然不起作用。
编辑 2
我已更新 href
值以显示我尝试过的内容。还是不行……
【问题讨论】:
【参考方案1】:用户上传的文件(由管理员或站点用户)转到媒体目录。 静态文件是由开发者(或第三方应用程序)提供的文件。
设置如下:
# Local disk paths
MEDIA_ROOT = '/Users/username/Projects/django_books/media/'
STATIC_ROOT = '/Users/username/Projects/django_books/static/'
# URLs visible in the browser's address bar
MEDIA_URL = '/media/'
STATIC_URL = '/static/'
并且在您的模板中使用STATIC_URL
变量:
<link rel="stylesheet" type="text/css" href=" STATIC_URL css/beers.css" />
并将您的样式移动到django_books/static/
目录。
【讨论】:
STATIC_URL
仅将 '/static/' 添加到 href 属性。它不使用静态根。我怎样才能做到这一点?
是的,STATIC_URL
在呈现的 HTML 中仅将“/static/”添加到 URL。要告诉 Django,在本地磁盘上查找文件的位置,请使用 STATICFILES_DIRS
和 STATICFILES_FINDERS
设置。请参阅文档:docs.djangoproject.com/en/1.5/ref/contrib/staticfiles/…【参考方案2】:
在我的项目中:django_learn,在模板中:check_uncheck_all.html,部分代码:
% load staticfiles %
<html>
<head>
<script type=text/javascript src="% static 'js/jquery-1.9.1.js' %"></script>
</head>
你也可以看看我的settings.py
【讨论】:
【参考方案3】:已找到静态文件,但权限设置不正确。 (即 403 而不是 404 服务器错误)
<VirtualHost *:80>
WSGIScriptAlias / /Users/username/Projects/django_books/django_books/django.wsgi
#the directory tag before was /Users/username/Projects/django_books/django_books/>
#this was one directory too deep
#from my structure above, you can see I needed to change my directory tag to this:
<Directory /Users/username/Projects/django_books/>
Order Allow,Deny
Allow from All
</Directory>
<Directory /Users/username/.virtualenvs/django_books/lib/python2.7/site-packages/django/contrib/admin/static/admin/>
Order Allow,Deny
Allow from All
</Directory>
Alias /static/admin/ /Users/username/.virtualenvs/django_books/lib/python2.7/site-packages/d$
Alias /static/ /Users/username/Projects/django_books/static/
</VirtualHost>
【讨论】:
第一个Alias
指令解决了我遇到的下一个问题,即我的管理 CSS 无法正常工作。我必须包含它,然后将它放在覆盖它的另一个 Alias
之前。以上是关于django 中媒体文件的正确路径/url的主要内容,如果未能解决你的问题,请参考以下文章