5

我想在我的 Django 应用程序中使用 Twitter Bootstrap,并为此修改了模板,方法如下:

<!DOCTYPE html>

<html>
<head>
    <title>{{ genplan.name }}</title>
    <link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
    <h1>{{ genplan.name }}</h1>
    <ol>
        {% for cur_goal in goals %}
            <li>{{ cur_goal.description }}</li>
        {% endfor %}
    </ol>

    ...
    <script src="http://code.jquery.com/jquery-latest.js"></script>
    <script src="js/bootstrap.min.js"></script>
</body>
</html>

MEDIA_ROOT并且MEDIA_URL设置正确。

MEDIA_ROOT = 'D:/dev/ccp/ccp-gp/media'
MEDIA_URL = '/media/'

但是,在我添加了 Bootstrap 样式表(该页面的外观没有改变)之后,一切都没有改变,我想 Django 没有找到 Bootstrap 资源。

是什么导致了这个问题?

更新1:

当我在urls.py

urlpatterns = patterns('',
    (r'^$', 'ccp_gp.general_plans.views.home'),     (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT})     )

Python 抱怨未定义的settings变量。

4

1 回答 1

9

MEDIA_URL加载css和js时需要使用:

<link href="{{ MEDIA_URL }}css/bootstrap.min.css" rel="stylesheet" media="screen">
<script src="{{ MEDIA_URL }}js/bootstrap.min.js"></script>

除非您必须使用不附带静态文件应用程序的旧 Django 版本,否则我建议您使用 STATIC_URL 并将文件放入static应用程序的目录中。

<link href="{{ STATIC_URL }}css/bootstrap.min.css" rel="stylesheet" media="screen">
<script src="{{ STATIC_URL }}js/bootstrap.min.js"></script>

如评论中所述,您{{ MEDIA_URL }}是空的。为了解决这个问题,请确保TEMPLATE_CONTEXT_PROCESSORS设置包含“静态”和“媒体”上下文处理器。除非您修改了 TEMPLATE_CONTEXT_PROCESSORS 设置,否则情况已经如此。

模板上下文处理器仅在使用 RequestContext 渲染模板时使用。从 Django 1.3 开始,最好的方法是使用TemplateResponse

例如:

from django.template.response import TemplateResponse

def index(request):
    genplan = ...
    goals = ...
    return TemplateResponse(request, 'index.html', {
        'genplan': genplan,
        'goals': goals,
    })

对于要通过开发服务器 ( manage.py runserver) 传递的 MEDIA_DIR 中的文件,您可以将以下代码添加到您的 urls.py:

from django.conf import settings

if settings.DEBUG:
    urlpatterns += (
        url(r'^media/(.*)$', 'django.views.static.serve',
                    {'document_root': settings.MEDIA_ROOT}),
    )
于 2013-01-28T21:45:03.510 回答