为啥我的 Django 管理站点没有样式/CSS 加载?

Posted

技术标签:

【中文标题】为啥我的 Django 管理站点没有样式/CSS 加载?【英文标题】:Why does my Django admin site not have styles / CSS loading?为什么我的 Django 管理站点没有样式/CSS 加载? 【发布时间】:2011-05-24 03:38:56 【问题描述】:

我使用 Django development version 创建了一个 Django 管理站点,但没有设置样式:

【问题讨论】:

是否有引用的样式未加载? 您需要配置开发服务器以提供静态文件:docs.djangoproject.com/en/1.2/howto/static-files @Pekka ,是的,它是 django 默认样式,在 D:\Python25\Lib\site-packages\django\contrib\admin\media 我遇到了同样的问题,即管理静态内容不可行,但使用 nginx(而不是开发环境)。基本上,检查您的 nginx 配置文件并确保它是您的“collectstatic”的位置。详情在这里:serverfault.com/questions/403264/… 【参考方案1】:

设置STATIC_ROOTSTATIC_URL 后,您可能需要运行

python manage.py collectstatic

【讨论】:

这也适用于 1.5.2。我不必更改或添加任何文件或代码 可能对某人有用:您应该为STATIC_ROOTSTATIC_URL 使用同名,例如:我结合了 "staticfiles"“静态”,使用了STATIC_ROOT=os.path.join(BASE_DIR, "staticfiles")"STATIC_URL="/static/"。我的应用程序运行良好,但找不到管理文件。所以将其同时更改为 "staticfiles""static" 尝试了多种方法,但这解决了问题。【参考方案2】:

ADMIN_MEDIA_PREFIX 现在已弃用,请改用STATIC_URL。在 settings.py 中设置 STATIC_URL = '/static/' 应该可以完成这项工作。试试:

import os.path  
import sys

PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__))

然后:

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

适用于 Django 1.4 pre-alpha SVN-16920。

【讨论】:

这对我也不起作用。我注意到,如果我(手动)将文件夹 static/admin 移动到 static/css/ 内,那么我可以访问 css 文件。所以似乎我可以访问 css 文件,只要它们在 static/files 内,但 collectstatic 并没有把它们放在那里。当然,手动移动文件夹是行不通的,因为模板继续指向static/admin 在尝试运行使用 Django v1.2 创建的管理界面时为我工作,在 1.3 上测试,然后在 v1.4 上重新部署。运行 Ubuntu 12.04 LTE 在我的例子中,我必须在应用程序中移动静态文件夹,只要确保 PROJECT_ROOT 指向 setting.py 的根目录。就我而言,它指向父文件夹。【参考方案3】:

Django 不自己提供静态文件。你必须告诉它文件在哪里。

ADMIN_MEDIA_PREFIX in the settings.py 会将 Django 指向正确的位置。

由于您使用的是开发版本,因此您需要dev-specific document for static files how-to。 Adam 的链接将引导您到 1.2 版本。

【讨论】:

很好的答案,但现在已弃用,并且在 settings.py 中不存在。阅读下文了解更多最新解决方案。 我有同样的错误,但在 Flask 中,我将我的 css 放在静态文件夹中。并使用 jinj2 2 suntax 即 url_for('static', filename='css/style.css') ,但仍然在我的笔记本电脑上出现此错误。我强制刷新页面,但问题仍然存在。请帮忙【参考方案4】:

我花了两天的时间尝试什么不!

最后将settings.py文件中的DEBUG改成:

调试 = 真

它成功了。

附言-

安全警告:不要在生产环境中打开调试运行!

【讨论】:

【参考方案5】:

我阅读了其他几个线程试图解决这个问题...与其他线程一样使用别名。 这假设您自己的自定义应用程序正确地提供静态文件,这表明您的 STATIC_ROOT 和 STATIC_URL 具有正确的设置。

STATIC_ROOT = ''
STATIC_URL = '/static/'

然后(从您的静态目录中):

ubuntu@ip-1-2-3-4:/srv/www/mysite.com/app_folder/static$ sudo ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/ admin

希望这对某人有所帮助...关于这个主题有很多线程。 :(

【讨论】:

【参考方案6】:

我在 Django Book Tutorial 之后也遇到了这个问题。 在第 5 章 | 安装模型中,书中提到了默认的 INSTALLED_APPS- “通过在它们前面放置一个井号 (#) 来临时注释掉所有六个字符串。” http://www.djangobook.com/en/2.0/chapter05.html

然后,在第 6 章中,本书告诉读者取消对这 6 行中的 4 行的注释- “请注意,我们在第 5 章中注释掉了这四个 INSTALLED_APPS 条目。现在取消注释它们。”

但是 statcifiles 行是将 CSS 恢复到管理页面所需要的,所以取消注释 'django.contrib.staticfiles',

【讨论】:

按照上面的建议在 settings.py 文件中取消注释“django.contrib.staticfiles”也对我有用。默认情况下,“django.contrib.staticfiles”应该出现在 INSTALLED_APPS 下的 settings.py 文件中。感谢克里斯的建议。 也从 Django Book 中获得。删除一个字符就可以了。【参考方案7】:

/project_name/project_name/settings.py 中,您需要设置STATIC_URL 来告诉您的站点使用哪个url 来存储静态文件。

然后将STATIC_ROOT 设置为文件系统上的某个文件夹,该文件夹与STATICFILES_DIRS 列表中列出的任何目录都不相同。

一旦设置了STATICFILES_ROOT,您就可以从项目目录运行python manage.py collectstatic

这将复制所有管理静态文件以及STATICFILES_DIRS 列表中列出的任何其他文件夹中的所有文件。基本上,这会将您的所有静态文件放在一个位置,这样您就可以在部署站点时将它们移动到您的 CDN。如果你和我一样没有 CDN,那么你有两种选择:

    将您设置为STATIC_ROOT 的文件夹添加到STATICFILES_DIRS 列表中。这将允许 django 中的静态文件查找器找到所有静态文件。 将包含静态文件的整个文件夹移至文件系统上的其他位置,并指示 STATICFILES_DIRS 包含该新位置。

我对这个答案没有任何关于安全性的看法,这只是我能够使用我的 Web 服务器为小型项目开发的方式。如果您正在做更大规模的事情,我希望您会想要一个 django 建议的 CDN。

更新: 我刚刚遇到了这个问题,这种方法并没有完全达到我认为你想要的效果。最终对我有用的是在我运行collectstatic 之后,我刚刚将它放入STATICFILES_ROOT 的管理静态文件复制到了我用于我自己的静态文件的目录中。这为我解决了这个问题。

【讨论】:

【参考方案8】:

除了许多其他有用的答案之外,我还有一个尚未注意到的问题。从 Django 1.3 升级到 1.6 后,我的静态文件目录的 django 管理静态文件的符号链接已损坏。

我的 settings.py 配置为:

STATICFILES_DIRS = (
    '/var/www/static/my-dev',
)

根据this answer,

Django 现在希望在 URL 下找到管理静态文件 /管理员/。

我有一个符号链接/var/www/static/my-dev/admin,它被设置为:

admin -> /usr/local/lib/python2.7/dist-packages/django/contrib/admin/media/

django 1.6 中不再存在该位置,因此我将链接更新为:

admin -> /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/

现在我的管理站点可以正常工作了。

【讨论】:

我有一个带有简单文件的简单项目。我的 css 在本地运行时加载,但是当我托管我的网站时 css 不加载,请帮助。【参考方案9】:

如果您使用 Apache 服务器来托管您的 django 站点,您需要确保静态别名指向您的 / 目录到 site/site_media/static/。如果您的静态文件位于 site/site/site_media/static/ 的 /directory 中,则以前的 Apache 别名配置将不起作用。

【讨论】:

【参考方案10】:

在学习 Django 教程时,我遇到了类似的问题,在我的情况下,问题是开发服务器在提供 css 文件时使用的 mimetype。

提供的 mimetype 是“application/x-css”,这导致 Chrome 中出现以下警告消息(在开发者工具的“网络”选项卡中):

资源被解释为样式表,但以 MIME 类型传输 application/x-css: "http://127.0.0.1:8000/static/admin/css/base.css"

我找到的解决方法:通过在 django webapp 的 manage.py 文件中添加以下行来更改要提供的 mimetype:

import mimetypes
mimetypes.init()
mimetypes.types_map['.css'] = 'text/css'

注意:在 Python 2.7 和 Chrome 40.0 上使用 Django 1.7.4 为我工作

【讨论】:

用 Django 2.2.1 试过这个,但它不起作用。我的管理面板静态 .css 文件由 nginx 提供,HTTP 代码为 200,但 Chrome 表示它们以 Content-Type: text/plain 的形式出现,并且它们没有在页面上呈现。【参考方案11】:

我在 django-1.10.5 和 python-2.7.13 中开发站点时遇到了同样的问题。但是在我的 firefox-51 和 chrome 中,登录页面能够获取 css 但仍然没有样式。但奇怪的是,它正在 IE-8 上运行..

我尝试做这里提到的所有可能的事情,并适合我的 sw 版本。没有任何效果。

但是当我在其他具有 python-2.7.8 的系统上尝试相同的站点时,它工作了..

如果对某人有帮助,请发布...

已编辑:后来我发现在python-2.7.13中,在settings.py中写了以下两行(加上清除浏览器的缓存)就可以了

import mimetypes
mimetypes.add_type("text/css", ".css", True)

【讨论】:

【参考方案12】:

通过为项目创建新的虚拟环境解决了我的问题,在此之前我使用的是通用系统级 python 解释器。

$ mkvirtualenv myproject

参考:https://docs.djangoproject.com/en/2.1/howto/windows/

【讨论】:

【参考方案13】:

运行:python manage.py collectstatic

将此行添加到位于 /etc/apache2/sites-available/000-default.conf 的 Vhost

别名 /static/admin/ /var/www/html/example.com/static/admin

这是 django 设置的整个 Vhost 设置

<VirtualHost *:80>
        ServerName gautam.tech
        ServerAlias www.gautam.tech

        WSGIDaemonProcess gautam.tech python-path=/var/www/html/gautam.tech python-home=/var/www/html/gautam.tech/venv
        WSGIProcessGroup gautam.tech
        #Your static files location
        Alias /static /var/www/html/gautam.tech/static
        Alias /media/ /var/www/html/gautam.tech/media
        Alias /static/admin/ /var/www/html/gautam.tech/static/admin

        <Directory /var/www/html/gautam.tech/static>
                Require all granted
        </Directory>

        <Directory /var/www/html/gautam.tech/media>
                       Require all granted
        </Directory>

        WSGIScriptAlias / /var/www/html/gautam.tech/myproject/wsgi.py

        DocumentRoot /var/www/html/gautam.tech
        <Directory /var/www/html/gautam.tech>
                <Files wsgi.py>
                        Require all granted
                </Files>
        </Directory>

        CustomLog /var/www/html/gautam.tech/access.log combined
        ErrorLog /var/www/html/gautam.tech/error.log
</VirtualHost>

这肯定行得通!

【讨论】:

很好的答案。我只需要运行 collectstatic 命令。【参考方案14】:

问题是在 dev/test/prod 服务器中并使用 Nginx,请按照以下步骤操作。

将 settings.py 中的配置设置如下

STATIC_URL = '/static/'

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

运行以下命令在静态文件夹中创建css和js文件

$ python manage.py collectstatic

在 /etc/nginx/sites-enabled/example (Nginx) 中配置以提供静态文件

location /static/ 
        alias /project/root/folder/static/;

【讨论】:

【参考方案15】:

确保 'django.contrib.staticfiles' 在您的 settings.py 中的 INSTALLED_APPS

【讨论】:

【参考方案16】:

这很好用而且很容易。我(手动)移动了文件夹。只是你必须从主项目的目录中复制你的 static/admin 并将其粘贴到 public_html static/ 如果没有静态文件夹,你必须在终端中运行以下命令

python manage.py collectstatic

在这里你可以使用 Django admin 的 css 工作

【讨论】:

【参考方案17】:

我看到有很多答案,但没有一个对我有用,所以我发布了我自己的。 为我解决的问题是将静态文件 URL 添加到应用程序的根 URL。我需要将此 URL 添加到我的 URL 列表中:

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

您还需要两个导入:

from django.conf import settings
from django.conf.urls.static import stati

更多可以在这个article查看。

【讨论】:

【参考方案18】:

如果您在 settings.py 中为 STATICFILES_DIRS 设置了一个值,并且声明的文件夹不存在或位置错误,则会导致管理员没有样式 例如 通过定义 STATICFILES_DIRS = ( os.path.join(BASE_DIR,"static")) 并且静态文件夹不存在

【讨论】:

【参考方案19】:

在尝试了 1000 条建议后失败了,我终于找到了一个有用的解决方案。这是我尝试过的和正在使用的。 我正在使用 django-1.11 和 nginx 网络服务器。 首先,我确保我的 CSS/js 文件在浏览器的控制台中没有得到 404。之后,我可以看到一个警告

资源解释为样式表,但使用 mime 类型 text/plain 传输

我在管理模板中找到了 base.html 并删除了

type="text/css"

现在这些行看起来像这样:

<link rel="stylesheet"  href="% block stylesheet %% static "admin/css/base.css" %% endblock %" /> 

这为我解决了这个问题。

【讨论】:

【参考方案20】:

配置静态文件 确保django.contrib.staticfiles 包含在您的INSTALLED_APPS 中。

在你的settings.py文件中,定义STATIC_URL,例如:

STATIC_URL = '/static/'

了解更多详情 static files

【讨论】:

【参考方案21】:

管理面板工作正常,但未加载 css。这适用于 Lightsail Django with Apache

1.在settings.py中定义STATIC_ROOT和STATIC_URL

STATIC_ROOT = '/opt/bitnami/projects/decisions/decision/'
STATIC_URL = '/static/'

2.Eject(复制)管理资产文件到项目

运行python manage.py collectstatic 此命令使用css/ fonts/ img/ js/ 子文件夹创建/opt/bitnami/projects/decisions/decision/admin 文件夹

3.使 /static url 可从 apache 访问

将此sn-p粘贴到/opt/bitnami/apache2/conf/bitnami/bitnami.conf(如果您设置了ssl,则文件位置将为/opt/bitnami/apache2/conf/bitnami/bitnami-ssl.conf

Alias /static/ "/opt/bitnami/projects/decisions/decision/"
<Directory "/opt/bitnami/projects/decisions/decision/">
    Order allow,deny
    Options Indexes
    Allow from all
    IndexOptions FancyIndexing
</Directory>

4.别忘了重启apache

sudo /opt/bitnami/ctlscript.sh restart apache

【讨论】:

【参考方案22】:

检查您的 settings.py 文件

STATIC_URL = '/static/'

开头和结尾都应该有反斜杠'/'..

【讨论】:

以上是关于为啥我的 Django 管理站点没有样式/CSS 加载?的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin 样式表不会加载到生产服务器上

为啥它呈现 django 管理站点而不是自定义注销页面

为啥我的 Fastcomet Django 网站没有加载 css?

为啥 Django 不加载我的 CSS?

当我将可选参数传递给视图时,为啥我的 CSS 静态文件在 Django 中不起作用?

Django Debug=假白噪声不起作用