Django_jinja2

Django 使用Jinja2模板

网上有很多教程,但我照着做还是遇到了很多坑,版本问题伤不起。

我的环境: ubuntu 16.4+python3.6+django(2.1) + jinja2(2.10.1)

先上别人的博客,然后我在补充下我到的坑。
传送门

  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

  1. 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") 的写法同理。

  2. STATIC_ROOT 不是根目录,是部署时收集起来的目录。

  3. 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') }}" >

几个老版本的写法:

  1. 在settings.py中的TEMPLATES/OPTIONS添加'builtins':['django.templatetags.static'],这样以后在模版中就可以直接使用static标签,而不用手动的load了。报错:没有builtins

  2. {%load staticfiles%}与{%load static%}之间有什么区别?前面老版本,后面新版本。

原文地址:https://www.cnblogs.com/ShawSpring/p/10891909.html