如何在 Django 项目/应用程序中组织和加载 CSS?

Posted

技术标签:

【中文标题】如何在 Django 项目/应用程序中组织和加载 CSS?【英文标题】:How to organize and load CSS within Django project/app? 【发布时间】:2012-10-14 01:24:59 【问题描述】:

我是 Django 新手。我阅读了文档,我对媒体根文件和静态根文件以及我应该将我的 css 文件与我的 javascript 文件放在哪里感到困惑。

你们能指出我正确的方向吗? 项目设置:

Project
     -myapp
         -model,view,and test
     -template
         - base.html
         - index.html
         - view1
         - view2
         - media
             - css
                 - style.css
                 - ie.css
             - js
             - img

     -setting.py
     -url.py

我的 static_url、static_root、media_url、media_root、STATICFILES_DIRS 和 STATICFILES_FINDERS 应该是什么样的?

我目前如何加载我的 css 文件是通过 base.html 使用以下内容:

% load staticfiles %
<link rel="stylesheet" type="text/css" href="% static user_stylesheet %"type="text/css" media="screen"/>

那么管理我的静态文件的最佳、最有效/正确的方法是什么? 谢谢大家的帮助。感谢您的时间和精力。

【问题讨论】:

【参考方案1】:

静态文件是一个简单的过程:

Django 将在INSTALLED_APPS 中的任何应用程序中搜索名为static/ 的目录以查找静态文件。如果您有未绑定到任何应用程序的文件,您可以将它们放在单独的目录中。这个目录应该被添加到STATICFILES_DIRS(一个元组),所以 django 知道它。在你的情况下,你应该有STATICFILES_DIRS = ('/home/user/Project/template/media',)

django.contrib.staticfiles 添加到您的INSTALLED_APPS

现在,如果您使用 runserver 进行测试,请打开您的 urls.py 并将 from django.contrib.staticfiles.urls import staticfiles_urlpatterns 添加到顶部,然后在定义完所有 URL 后,在文件末尾添加 urlpatterns += staticfiles_urlpatterns()

您已经有了访问问题中静态文件的正确方法。另一种方法是使用 STATIC_URL ,并确保您使用RequestContext 发送回复。如果您使用基于类的视图,则无需更改任何内容。对于您的其他普通视图方法,只需使用render shortcut。


STATIC_URLSTATIC_ROOT 在部署时会派上用场。

STATIC_URL 是您的 Web 服务器配置的 URL 前缀,用于指向系统中包含您的静态文件的位置。这是一个 url 组件必须以斜线结尾。例如/static/

STATIC_ROOT 这是系统上目录的路径。当您准备好部署时,运行collectstatic 命令,django 将找到您所有的静态文件并将它们转储到STATIC_ROOT 指向的目录中。然后你可以使用这个目录,把它放在你的 web 服务器配置的 DOCUMENT_ROOT 文件夹中。然后,将/static/ URL 指向此文件夹。例如STATIC_ROOT = /home/user/project/www/

如果 Apache 配置了 DOCUMENT_ROOT/var/www/,并且您的 STATIC_URL 设置为 /static/;运行collectstatic 后,将文件夹/home/user/project/www/ 的内容移动到/var/www/static/


STATICFILES_FINDERS。此设置列出了 django 在运行 collectstatic 时可以用来搜索静态文件的方法,您通常根本不需要修改它。
MEDIA_ROOTMEDIA_URL。这些设置控制文件系统位置,以及使用 django 上传的任何文件的 URL 前缀;这些不能与STATICFILES_DIRS相同。您需要手动处理此问题,因为collectstatic 不会触及这些位置。如果您在开发中测试文件上传,可以使用django.views.static.serve() 提供来自MEDIA* 的文件。

【讨论】:

【参考方案2】:

我建议您将所有 js 和 css 文件保存在一个名为“静态”的文件夹中,该文件夹位于应用程序文件夹之外的某个位置(django 建议这样做) 例如,如果您将其保存在 /var/www/static/ 下 因此,在这种情况下,这就是您的属性的样子: STATIC_DIR = "/var/www/static/" STATIC_URL = "/static/" (可以是任何东西) STATICFILES_FINDERS = ('django.contrib.staticfiles.finders.FileSystemFinder',)

在模板中,您可以使用模板标签 STATIC_URL 引用静态文件夹,并将路径的其余部分附加到静态文件夹中的文件。请注意,要使用 STATIC_URL 模板标签,您需要从视图代码中传递 context_instance。

【讨论】:

【参考方案3】:

媒体服务是 Django 是一个“东西”。

您可以在此处查看文档的链接: https://docs.djangoproject.com/en/dev/howto/static-files/

但神奇之处如下**如果这不是生产中**您可能需要在urls.py 的底部添加以下内容:

from django.conf import settings

# ... the rest of your URLconf goes here ...

if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', 
            'document_root': settings.MEDIA_ROOT,
        ),
   )

对于生产服务器,您通过网络服务器(apache 或其他)提供媒体老式风格,使用相同的域,但实际上完全独立于您的 Django/Python 站点。

【讨论】:

以上是关于如何在 Django 项目/应用程序中组织和加载 CSS?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django项目中组织大量页面的分页?

使用成分、食谱和组件组织 django 食谱应用程序模型的最佳方式

模板不存在。加载静态文件和模板 Django 项目结构

Django中使用Redis进行缓存

文件更改时如何自动重新加载Django?

如何在 Django 上组织前端?