Django 使用Jinja2模板
网上有很多教程,但我照着做还是遇到了很多坑,版本问题伤不起。
我的环境: ubuntu 16.4+python3.6+django(2.1) + jinja2(2.10.1)
先上别人的博客,然后我在补充下我到的坑。
传送门
-
静态文件:
# 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 中的文件夹中。
为什么不直接放在static文件夹下?文件命名空间
eg:把 jquery.js 这种各个app通用的文件放在 common_static/js/ 下,这样就可以 在 /static/js/jquery.js 中访问到它!
部署时 需要收集静态文件
python manage.py collectstatic
这一句话就会把以前放在app下static中的静态文件全部拷贝到 settings.py 中设置的 STATIC_ROOT 文件夹中
当 DEBUG = True 时,Django 就能自动找到放在里面的静态文件。(Django 通过 STATICFILES_FINDERS 中的“查找器”,找到符合的就停下来,寻找的过程 类似于 Python 中使用 import xxx 时,找 xxx 这个包的过程)。
比较容易混淆的几个点 STATIC_URL
-
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") 的写法同理。 -
STATIC_ROOT 不是根目录,是部署时收集起来的目录。
-
STATICFILES_DIRS 是通用目录和其他目录(地址随便在你计算机上哪里),按照STATICFILES_FINDERS的默认查找顺序,他的优先级还高于App目录下的static目录。
jinja2 中static url
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%}之间有什么区别?前面老版本,后面新版本。