網上有不少教程,但我照着作仍是遇到了不少坑,版本問題傷不起。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%}之間有什麼區別?前面老版本,後面新版本。