Django和CSS的一个简单例子

时间:2012-02-05 00:50:50

标签: css django

我是Django的新手,我正在尝试设置一个非常简单的Django应用程序。

现在,我要读到Django在线书籍的第5章:http://www.djangobook.com/en/2.0/chapter05/

在我开始尝试数据库之前,我现在要做的就是将一些简单的CS和J添加到应用程序中。

所以问题是,我该怎么做?我只有一个应用程序,我只需要一个css文件夹中的main.css和一个js文件夹中的main.js。

我查看了https://docs.djangoproject.com/en/1.3/howto/static-files/#staticfiles-in-templates页面,但在阅读和阅读之后,就例子而言似乎没有很多工作要做。

如何导入stylesheets / css(有没有像CakePHP这样的帮手?),我在哪里放置CSS和JS文件,是否需要配置静态东西?

更新:链接:Render CSS in Django没有多大帮助。主要是因为它对我不起作用,但我也特别不喜欢“if debug”部分。当我搬到prod时会发生什么?为什么我的媒体文件夹对于prod和本地开发者的定义不同?它不应该是相对的,甚至不是同一个地方吗?

5 个答案:

答案 0 :(得分:25)

如果你遵循django的指导方针,你可以大大简化你的生活。

在示例代码中,在应用程序目录中,创建一个名为 static 的文件夹。在此文件夹中,放置您的css文件。

示例:

$ django-admin.py startproject myproject
$ cd myproject
myproject$ python manage.py startapp myapp
myproject$ mkdir myapp/static
myproject$ cd myapp/static
myproject/myapp/static$ nano style.css

在模板中:

<link rel="stylesheet" href="{{ STATIC_URL }}style.css" />

确保将myapp添加到INSTALLED_APPS中的settings.py列表中。现在,当您使用内置开发服务器时,您的样式表将正确呈现。

Django默认在已安装的应用程序中搜索static目录,并且对于当前版本的django,默认情况下会启用静态文件。


  

Django示例的路径为my_app/static/my_app/myimage.jpg   如果您的应用和项目具有相同的名称,则会有点混乱。

建议这样做是因为当您运行collectstatic来收集所有静态文件时,将覆盖具有相同名称的文件。如果您在另一个应用程序中有一个名为myimage.jpg的文件,它将被覆盖。在静态目录中提供应用程序名称将阻止这种情况,因为确切的目录结构将在STATIC_ROOT目录中复制。

一个简单的例子来说明这一点。如果您有一个包含两个应用程序的django项目,请执行以下操作:

.
├── assets
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── models.py
│   ├── static
│   │   └── myapp
│   │       └── test.txt
│   ├── tests.py
│   └── views.py
├── myproj
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   └── wsgi.py
└── otherapp
    ├── __init__.py
    ├── models.py
    ├── static
    │   └── otherapp
    │       └── test.txt
    ├── tests.py
    └── views.py

assets是您的STATIC_ROOT。现在当你运行collectstatic

.
├── assets
│   ├── myapp
│   │   └── test.txt
│   └── otherapp
│       └── test.txt
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── models.py
│   ├── static
│   │   └── myapp
│   │       └── test.txt
│   ├── tests.py
│   └── views.py
├── myproj
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   └── wsgi.py
└── otherapp
    ├── __init__.py
    ├── __init__.pyc
    ├── models.py
    ├── static
    │   └── otherapp
    │       └── test.txt
    ├── tests.py
    └── views.py

你看到它也在创建目录。在您的模板中,您现在可以使用应用程序的“命名空间”来引用每个文件:{{ STATIC_URL }}/myapp/test.txt

答案 1 :(得分:6)

要使examples you pointed at正常工作,您的静态文件必须位于Django内置staticfiles应用可访问的位置。

实现这一目标有几个步骤:

首先,在项目目录中(即在manage.py文件旁边),您需要创建一个目录来保存静态文件。称之为“static_files”。

接下来,您需要让Django知道查看该目录,方法是在STATICFILES_DIRS文件的settings.py列表中指定它。

这样的事情:

STATICFILES_DIRS = [
    '/full/path/to/your/project/static_files/',
]

static_files目录中,您可以创建所需的任何结构,这样您的cssjs目录就可以到达。

之后,您应该可以使用模板中的{{ STATIC_URL }}标记来访问静态文件的基本URL。

因此,比方说,例如,您创建了project/static_files/css/base.css,您可以在模板中使用它,如下所示:

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

希望有所帮助!

修改

使用STATICFILES_FINDERS的默认设置,Django应自动提供STATICFILES_DIRS中列出的目录中的所有文件 - 有关详细信息,请参阅the docs

如果这不起作用,请检查一些事项:

  • 您是否已将STATICFILES_FINDERS设置修改为默认设置以外的其他设置?
  • django.contrib.staticfiles中的INSTALLED_APPS列表中是settings.py吗?
  • 您使用的是Django的内置服务器(python manage.py runserver)吗?
  • 您的DEBUG = True中有settings.py吗?如果没有,您需要将其设置为True或使用the insecure option (python manage.py runserver --insecure)。投入生产时,请查看collectstatic command

答案 2 :(得分:5)

推荐的方法再次改变(至少从我认为的Django 1.5开始)。

在模板顶部放置:

{% load staticfiles %}

然后,使用相同的目录结构(myapp/static/myapp/style.css):

<link rel="stylesheet" href="{% static 'myapp/style.css' %}" />

Source

答案 3 :(得分:3)

Django 1.3中静态文件的处理已经发生了显着变化(更好)。特别是静态文件(认为代码需要CSS / JS /图像)和媒体文件(想想用户在使用您的应用程序时上传的图像)之间的灵活区别。 staticfiles应用可以处理您的要求。

django.contrib.staticfiles放入您的settings.py INSTALLED_APPS中。然后在app目录中创建一个static目录 - project/app/static/。在该静态目录中,您可以根据需要组织支持文件(css /,js /,images /,icons /等)。默认情况下,staticfiles将在静态/目录中查找INSTALLED_APPS中列出的每个应用。不只是你自己的,还有所有Django应用和第三方应用。 (旁注:Django 1.4中的Admin移动到这个范例,而在1.3中它仍然使用ADMIN_MEDIA_PREFIX。)

staticfiles应用程序知道所有应用程序中的所有静态/目录,但它需要收集所有内容才能提供服务。在开发中,当使用manage.py runserver时,它会为您处理。 Django将运行您的站点并自动提供来自所有静态源的所有静态内容。 (另一个答案中提到的源是在STATICFILES_FINDERS设置中设置的。)不使用runserver时,使用manage.py collectstatic将所有静态文件收集到STATIC_ROOT中定义的文件夹中。 将此目录保留为空。这是一个收集目标。当然,您的Web服务器需要配置为提供此目录。

现在还有一件 - 视图。这是STATIC_URL发挥作用的地方。在模板中引用静态文件时,最简单的方法是使用{{ STATIC_URL }}。默认情况下,Django使用RequestContext使该变量可用于任何视图。做这样的事情 - <link rel="stylesheet" href="{{ STATIC_URL }}/css/main.css" />

有关在模板中引用STATIC_URL的更多信息和更多方法,请查看this answer类似的问题。

答案 4 :(得分:1)

终于我经过很多天了,这是应该怎么做的 1>您需要在应用程序中以及项目中使用静态文件 2>这是setting.py

   if DEBUG:
   STATIC_ROOT = "/PycharmProjects/don/admin/shopping/static/css"

    STATICFILES_DIRS =(
     #os.path.join(os.path.dirname(BASE_DIR),"static","static"),
     os.path.join(BASE_DIR, "static"),
    )

3> views.py

        from django.views.generic import TemplateView
        class HomeView(TemplateView):
               template_name = 'index.html'

4>模板文件

       {% load staticfiles %}
        <link rel="stylesheet" href="{% static 'css/style.css' %}">

5> urls.py

            from shopping.views import HomeView 
             from django.conf import settings
             from django.conf.urls.static import static
           urlpatterns = [
            url(r'^admin/', admin.site.urls),
             url(r'^$', HomeView.as_view())
          ]
        if settings.DEBUG:
       urlpatterns+=static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)

6>     python manage.py collectstatic  

have fun :)