我正在尝试在为Django制作的HTML模板文件中添加.css和.js文件。我已关注official doc,因此我的配置设置为:
urls.py
urlpatterns = patterns('',
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.STATIC_DOC_ROOT}),
settings.py
STATIC_DOC_ROOT = ''/myfirstapp/templates/seminar_form/'
但是我仍然无法做到正确,那些.css .js和图片文件仍然没有加载到我的HTML中,但这些文件可以通过点击浏览器上的URL来访问(完全可见) 像这样:
http://127.0.0.1:8000/site_media/images/calendar.png
模板代码
<img src="{{ site_media }}images/calendar.png">
答案 0 :(得分:9)
如果您可以直接在浏览器中点击网址来查看文件,那么我猜您的MEDIA_URL
设置错误,或者您的模板代码出现了问题。您的CSS / JS /图像的HTML引用是什么URL?
确保您通过了MEDIA_URL
,因此它可以在模板的上下文中使用,您可以通过将RequestContext
中传递给视图函数的请求包装起来来完成,如下所示:
def some_view(request):
# ...
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
如果您的MEDIA_URL
设置正确,并且您正确地为您的媒体提供服务(您的问题表明您是这样),您应该可以使用以下内容访问媒体:
<img src="{{ MEDIA_URL }}relative/path/to/media.jpg" alt="Foobar" />
从您的模板代码中,您似乎试图引用以名为site_media
的模板变量为根的文件,这可能不存在。
您需要在settings.py
:
MEDIA_URL = u'/site_media/'
然后将模板代码更改为以下内容:
<img src="{{ MEDIA_URL }}images/calendar.png">
并确保从视图功能中将MEDIA_URL
传递给您的模板。
RequestContext
:在线Django书有一些有用的(虽然目前缺少一些部分)documentation关于RequestContext
。就个人而言,我使用django-annoying的render_to
装饰器来避免不得不考虑它。代替我之前的示例视图代码,您可以这样做:
from annoying import render_to
@render_to('my_template.html')
def some_view(request):
...
return my_data_dictionary
基本上,你只是装饰你的视图函数,传入你想要渲染的模板,然后只返回一个包含你想要设置的额外上下文变量的dict
(即上下文变量除了那些设置为您可以RequestContext
,例如MEDIA_URL
)。
如果您的视图可能会根据某些条件使用不同的模板,这种方法显然不起作用,但有一些简单的方法:
def some_view(request, some_var):
...
if some_var:
return render_to_response('my_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
else:
return render_to_response('my_other_template.html',
my_data_dictionary,
context_instance=RequestContext(request))
可以改写为:
def some_view(request, some_var):
...
if some_var:
return _some_private_view(request, my_data_dictionary)
else:
return _some_other_private_view(request, my_data_dictionary)
@render_to('my_template.html')
def _some_private_view(request, my_data_dictionary):
return my_data_dictionary
@render_to('my_other_template.html')
def _some_private_view(request, my_data_dictionary):
return my_data_dictionary
至少对我来说这似乎更清楚。
答案 1 :(得分:2)
关于图像加载的简单解释,我发现:
在settings.py中:
from os import path
#media files are in <project folder>/static-media
MEDIA_ROOT = path.join(path.abspath(path.dirname(__file__)), 'static-media')
在urls.py中:
from django.conf import settings
urlpatterns += patterns(
url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)
在html中的用法:
<!--image location - <project folder>/static-media/images/calendar.png-->
<img src="/media/images/calendar.png">
答案 2 :(得分:2)
对我有用的是,将静态文件路径添加到STATICFILES_DIRS。在开发环境中,这似乎是更好的解决方案
STATICFILES_DIRS = (
'/path/to/your/static/files/',
)
例如:
STATICFILES_DIRS = (
'/home/chathuranga/App/templates/',
)
希望这有帮助。