网上有不少教程,但我照着作仍是遇到了不少坑,版本问题伤不起。css
个人环境: ubuntu 16.4+python3.6+django(2.1) + jinja2(2.10.1)python
先上别人的博客,而后我在补充下我到的坑。
传送门jquery
# settings.py STATIC_URL = '/static/' # 当运行 python manage.py collectstatic 的时候 # STATIC_ROOT 文件夹 是用来将全部STATICFILES_DIRS中全部文件夹中的文件,以及各app中static中的文件都复制过来 # 把这些文件放到一块儿是为了用apache等部署的时候更方便 STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static') # 其它 存放静态文件的文件夹,能够用来存放项目中公用的静态文件,里面不能包含 STATIC_ROOT # 若是不想用 STATICFILES_DIRS 能够不用,都放在 app 里的 static 中也能够 STATICFILES_DIRS = ( os.path.join(BASE_DIR, "common_static"), '/path/to/others/static/', # 用不到的时候能够不写这一行 ) # 下面这个是默认设置,Django 默认会在 STATICFILES_DIRS中的文件夹 和 各app下的static文件夹中找文件 # 注意有前后顺序,找到了就再也不继续找了 # STATICFILES_FINDERS = ( # "django.contrib.staticfiles.finders.FileSystemFinder", # "django.contrib.staticfiles.finders.AppDirectoriesFinder" # )
静态文件放在对应的 app 下的 static 文件夹中 或者 STATICFILES_DIRS 中的文件夹中。apache
为何不直接放在static文件夹下?文件命名空间django
eg:把 jquery.js 这种各个app通用的文件放在 common_static/js/ 下,这样就能够 在 /static/js/jquery.js 中访问到它!ubuntu
python manage.py collectstatic
这一句话就会把之前放在app下static中的静态文件所有拷贝到 settings.py 中设置的 STATIC_ROOT 文件夹中app
当 DEBUG = True 时,Django 就能自动找到放在里面的静态文件。(Django 经过 STATICFILES_FINDERS 中的“查找器”,找到符合的就停下来,寻找的过程 相似于 Python 中使用 import xxx 时,找 xxx 这个包的过程)。ui
STATIC_URL = '/static/' 不是路径 url的意思。它是映射的意思。静态文件的绝对路径(STATICFILES_DIRS里的路径或者App目录下static路径或STATIC_ROOT的路径),好比 "/home/xxx/code/mysite/static/app/css/style.css",直接映射为:“/static/app/css/style.css”。url访问静态文件:http://127.0.0.1:8000/static/app/css/style.css. {% static 'appname/css/style.css' %}, {% static %} 模板标签会生成静态文件的绝对路径。
url("images/background.gif") 的写法同理。url
STATIC_ROOT 不是根目录,是部署时收集起来的目录。.net
STATICFILES_DIRS 是通用目录和其余目录(地址随便在你计算机上哪里),按照STATICFILES_FINDERS的默认查找顺序,他的优先级还高于App目录下的static目录。
django模板写法
{% load static %} <link rel="stylesheet" href="{% static 'style.css' %}">
jinja2写法
{{ static('css/index.css') }} {{ url('detail', args=(question.id, ) }}
注意再也不须要 load static,注意两层引号
<link rel ="stylesheet" href="{{ static('appname/stytle.css') }}" >
在settings.py中的TEMPLATES/OPTIONS添加'builtins':['django.templatetags.static'],这样之后在模版中就能够直接使用static标签,而不用手动的load了。报错:没有builtins
{%load staticfiles%}与{%load static%}之间有什么区别?前面老版本,后面新版本。