我是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和本地开发者的定义不同?它不应该是相对的,甚至不是同一个地方吗?
答案 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
目录中,您可以创建所需的任何结构,这样您的css
和js
目录就可以到达。
之后,您应该可以使用模板中的{{ 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
吗?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' %}" />
答案 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 :)