正在开发的Django站点:CSS没有加载所有页面

时间:2012-01-26 22:29:18

标签: django django-templates

我担心我在这里不知所措,我检查了一些类似的问题,但似乎都没有适用。

我在笔记本电脑上运行django developpement服务器。我也用它来提供静态文件。我在静态根目录中有一个文件夹,其中包含2个名为base.html的模板的CSS。

这是有效的那个部分:

<head>
    <title>| Entries | Latest entries</title>
    <link rel="stylesheet" type="text/css" href="/static/css/serenity.css" />
</head>

这是一个没有:

<head>
    <title>Latest Photo Galleries</title>
    <link rel="stylesheet" type="text/css" href="/static/css/photologue.css" />
</head>

urls.py:

    (r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.STATIC_ROOT}),

和静态网址:

    STATIC_URL = '/static/'

STATIC_ROOT是绝对路径。

当我查看源代码并尝试打开指向css的链接时,我得到了404(未找到)

为什么Django为一个app而不是另一个应用程序提供css文件? (不工作的是光子模板。)

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:12)

您使用staticfiles的方式略有不正确。虽然我无法准确地告诉您导致您当前情况的原因,但我可以告诉您,您的方法将来会让您头疼。首先,我同意关于在Django服务器终端中观察您的请求流量的评论。查找4xx响应并确保请求的URL正确无误。这:/Static/css/photologue/css中有两个错误。

如果您不想进一步阅读,请删除urls.py static.server行并观察服务器终端。现在,这里是如何工作的......

您的设置变量已正确,但您可能会误解STATIC_ROOT 目的。 STATIC_URL是静态文件的完全限定或相对URL。 STATIC_ROOT是最终将保存所有静态文件的文件夹。 它应该是空的。 Django负责通过manage.py collectstatic command填写它。这个想法是你的Django项目中的每个应用程序都有自己的静态/文件夹,其中包含所需的js / css / image资产。此外,Django将为管理员和您使用的任何其他第三方软件包收集静态资产。所有这些资产都将组织到您的STATIC_ROOT文件夹中。假设您收集之前收集的文件仍然存在,这是不安全的。

STATIC_ROOT = '/path/to/empty/static/folder/'  # or something dynamic with os.path methods
STATIC_URL = '/static/'

在您的情况下,您的宁静应用可能有serenity/static/css/serenity.css,而且照片有photologue/static/css/photologue.css。您可以将共享资源放在base/static/文件夹中。

现在正确提供静态媒体。请勿使用'django.views.static.serve'中的urls.py行。 Django的runserver自动提供静态文件。在幕后,它正在处理收集行为并将所有静态资产收集在一起并为其提供服务。在Django 1.3中使用这种类型的URL模式是不必要的,混淆的来源,以及将错误地投入生产的事情。请记住,您的网络服务器(Apache / Nginx)提供静态资产。你的Django urls.py文件不需要知道关于&#39; em的事情。

参考模板中的静态网址。您已在模板中对/static/进行了硬编码。这将起作用(但仅因为STATIC_URL是相同的值)。为了更加灵活,您已获得three options

  1. 使用href="{{ STATIC_URL }}css/photologue.css"。只要您包含&#39; django.core.context_processors.static&#39;该变量就会出现在您的模板中。在您的TEMPLATE_CONTEXT_PROCESSORS中。
  2. 使用模板标签:{% load static %} ... href="{% get_static_prefix %}css/photologue.css"
  3. 在Django 1.4中,您可以使用{% load static from staticfiles %}... href="{% static 'css/photologue.css' %}"
  4. 值得阅读Django中的静态文件并了解Django 1.4中的更改

答案 1 :(得分:1)

我发现可能会发生两个问题:

  • 未在设置文件中设置STATIC变量。

(你有很多答案)

  • 您可能没有在apache配置中设置/ static / alias。

将此行添加到/etc/apache2/httpd.conf文件或/ etc / apache2 / sites-available / myDjangoConfig:

Alias /static/ {valueOfSTATIC_ROOT}

然后重启Apache服务器:

sudo service apache2 reload

答案 2 :(得分:0)

STATIC_ROOT不与Django dev服务器一起使用 - 仅当您部署到prod或使用其他服务器时。 STATIC_ROOT是您收集静态文件后将存储的位置(使用“collectstatic”方法)。

它适用于一个应用程序但不适用于另一个应用程序的原因是因为一个应用程序具有对CSS文件夹的正确引用,而另一个应用程序没有。对于初学者,尝试将“静态”目录从一个应用程序复制到另一个应用程序,看看它是否有效。

此处有更多信息:https://docs.djangoproject.com/en/1.3/howto/static-files/

答案 3 :(得分:0)

您可以尝试以下步骤:

  1. 打开您的settings.py和
  2. - 在你文件的第一行添加:

    import os.path
    PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
    

    - 将您的STATIC_ROOT值更改为:

    STATIC_ROOT = os.path.join(PROJECT_DIR, 'static/')
    

    - 将您的STATIC_URL值更改为:

    STATIC_URL = '/static/'
    
    1. 在项目根目录中创建名为“static”的文件夹。
    2. 为您的静态文件创建一个文件夹,如css,javascript等。我建议您为不同类型的文件使用不同的文件夹。
    3. 打开项目的urls.py. - 添加到您的导入:导入设置 - 添加到网址模式:

      (r'(?:。*?/)?(?P(css | jquery | jscripts | images)/。+)$','django.views.static.serve',{'document_root':设置.STATIC_ROOT}),

      注意:在此示例中,我的静态文件夹中有名为css,jquery,jscripts和images的文件夹。

    4. 在您的模板中添加:

    5. 用于css文件:(在本例中,default.css是css文件的名称)

      <link href="{{ STATIC_URL }}css/default.css" rel="stylesheet" type="text/css" media="all" />
      

      for javascript:

      <script type="text/javascript" src="{{ STATIC_URL }}jquery/jquery.js"></script>