我开始使用django应用程序并尝试在主页中显示图像。但是图像没有显示出来。
我的settings.py:
MEDIA_ROOT = os.path.join(BASE_DIR,"media")
MEDIA_URL = "/media/"
我的urls.py:
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'myapp.views.home', name='home'),
# url(r'^blog/', include('blog.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'',include('users.urls')),
)
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我的home.html:
<html>
<head>
<title>MY SITE</title>
</head>
<body>
<img src="/media/image/myimage.jpg" alt="my image"/>
Welcome to my site
</body>
</html>
我显示文字my image
而不是图片
答案 0 :(得分:6)
这意味着你需要破解你的MEDIA引用。 (MEDIA实际上是用于文件上传的),你不需要在urls.py文件中使用staticfiles_urlpatterns。当你将“django.contrib.staticfiles”添加到settings.py
时,你会得到这种开箱即用的行为概述:以下是django 1.6中文件树布局的样子,以及我在此答案中引用的文件结构。
├── djproj
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
├── manage.py
└─── myapp
├── admin.py
├── __init__.py
├── models.py
├── static
│ └── myapp
│ └── myimage.jpg
├── templates
│ └── index.html
├── tests.py
└── views.py
第1步:确保您的INSTALLED_APPS中包含django.contrib.staticfiles。
第2步:在您的设置文件中,定义STATIC_URL,例如:
STATIC_URL = '/static/'
第3步:将您的home.html更改为这样(我在我的示例中使用了index.html)
[PROJECT_HOME / myapp / templates / index.html]
<html>
<head>
<title>MY SITE</title>
</head>
<body>
{% load staticfiles %}
<img src="{% static "myapp/myimage.jpg" %}" alt="My image"/>
Welcome to my site
</body>
</html>
请务必阅读与STATICFILES_STORAGE相关的django-1.6 staticfiles documentation,以便了解这些模板标记为您带来的收益。提示:python manage.py collectstatic
第4步:(您可能已经完成了此操作,但我没有看到)确保您的settings.py中定义了TEMPLETE_DIRS并包含您的home.html(此处的关键是django的模板引擎需要服务于此,因为我们将使用一些模板标签)
[PROJECT_HOME / djproj / settings.py]
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
BASE_DIR + '../myapp/templates',
)
第5步:构建一个呈现home.html页面的视图。
[PROJECT_HOME / myapp / views.py]
from django.shortcuts import render_to_response
def index( request ):
return render_to_response('index.html')
由于这有点令人费解,而且这里有几个活动的部分:here is a changeset显示完整的“更改”
如果任何一个混乱,你可以粗略地拉动整个github项目。 django-staticfiles-setupexample
最后注意:在django中并不总是以这种方式处理STATIC文件。 MEDIA目录曾经是您追求的设置。所以这个答案适用于Django 1.6(静态文件是在django 1.3版中添加的)(目录布局在django 1.5中已经更改)。
您可以(正如您尝试的那样)将您的媒体目录硬连接到STATIC定义。我也这样做 - 不推荐这个。这就是为什么我没有这样描述如何做到这一点。
答案 1 :(得分:1)
昨天,我整整一天都在努力解决这个问题……我终于放弃了,继续创建自己的网站,而不必担心图像。然后,今天我决定检查网站的响应能力。我发现我的URL没问题,因为我严格遵守文档和最佳实践。 chrome控制台说:
无法加载资源:net :: ERR_BLOCKED_BY_CLIENT
问题出在HTTP Referral Policy上。去看一下。因此,在进行了一些研究之后,this起到了很大的作用,我发现AdBlock阻止了我引用的图像。显然,我的/ media /路径以其正则表达式模式之一进行了标记,从而确定我的图像已重定向到Ads。具有讽刺意味的是,我的网站是关于广告的...因此,它必须在很大程度上被考虑在内,因为我的网站的网址格式中包含诸如“ ad”之类的词。长话短说,我禁用了AdBlock,现在可以渲染图像。因此,我认为值得考虑的是,即使使用Django代码中的最佳做法,这种错误也可能是由浏览器引起的!
答案 2 :(得分:0)
您在列表中添加媒体网址太晚了。 Django将尝试连续匹配每个urlpattern
,当它到达第一个时停止。在这种情况下,它匹配r''
并且无法访问静态文件或媒体网址。
您可以将每个模式放入patterns()
的单个调用中,而不是使用+=
。那将是最干净的,但我不能在这里测试它。一个确定的方法是将“users.urls”行拉出来并稍后添加,如下所示:
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
)
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += url(r'',include('users.urls'))
答案 3 :(得分:0)
我建议您设置DEBUG = TEMPLATE_DEBUG = True并直接请求图片网址。
您将获得Django调试输出,或者显示URL无法匹配或者它实际上正在寻找的文件路径。
虽然您没有共享BASE_DIR,但设置看起来大致正确。在这种情况下,这很重要。