Django静态文件没有加载

Swi*_*tch 3 django

我正在尝试在为Django制作的HTML模板文件中添加.css和.js文件.我已经关注了官方文档,因此我的配置设置为:

urls.py

urlpatterns = patterns('',
            (r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
                {'document_root': settings.STATIC_DOC_ROOT}),
Run Code Online (Sandbox Code Playgroud)

settings.py

STATIC_DOC_ROOT = ''/myfirstapp/templates/seminar_form/' 
Run Code Online (Sandbox Code Playgroud)

但是我仍然无法做到正确,那些.css .js和图像文件仍然没有加载到我的HTML中,但是这些文件可以通过点击浏览器上的URL来访问(完全可见):

http://127.0.0.1:8000/site_media/images/calendar.png 
Run Code Online (Sandbox Code Playgroud)

模板代码

<img src="{{ site_media }}images/calendar.png"> 
Run Code Online (Sandbox Code Playgroud)

Dom*_*ger 9

如果你可以通过直接在浏览器中点击URL来查看文件,那么我猜你的MEDIA_URL设置有误,或者你的模板代码有问题.您的CSS/JS/Images的HTML引用是什么URL?

确保你正在通过你MEDIA_URL的模板上下文中提供它,你可以通过将传递给你的视图函数的请求包装起来来完成RequestContext,如下所示:

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

如果您的MEDIA_URL设置正确无误,并且您正确地为您的媒体提供服务(您的问题表明您正在使用),您应该可以使用以下内容访问媒体:

<img src="{{ MEDIA_URL }}relative/path/to/media.jpg" alt="Foobar" />
Run Code Online (Sandbox Code Playgroud)

编辑后显示模板代码:

从您的模板代码看,您似乎正在尝试引用以被调用的模板变量为根的文件site_media,这可能不存在.

你需要把这样的东西放在你的settings.py:

MEDIA_URL = u'/site_media/'
Run Code Online (Sandbox Code Playgroud)

然后将模板代码更改为以下内容:

<img src="{{ MEDIA_URL }}images/calendar.png">
Run Code Online (Sandbox Code Playgroud)

并确保MEDIA_URL从视图功能传递到您的模板.

评论后要求澄清RequestContext:

在线Django的书有一些有用的(尽管目前缺乏在某些地区)的文档有关RequestContext.就个人而言,我使用render_todjango-annoying 的装饰器来避免不得不考虑它.代替我之前的示例视图代码,您可以这样做:

from annoying import render_to

@render_to('my_template.html')
def some_view(request):
    ...
    return my_data_dictionary
Run Code Online (Sandbox Code Playgroud)

基本上,您只需装饰视图函数,传入要渲染的模板,然后返回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))
Run Code Online (Sandbox Code Playgroud)

可以改写为:

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
Run Code Online (Sandbox Code Playgroud)

至少对我来说这似乎更清晰.