注意:

在django中,对于 { { } }和{ % % },前后的 “{ {“ 以及 “{ %” 中间是没有空格的,由于hexo渲染的问题,本篇文章的某些部分不得已在中间加空格,但切记是没有的!!!

模板

在Django框架中,模板是可以帮助开发者快速生成呈现给用户
页面的工具

模板的设计方式实现了我们MVT中VT的解耦,VT有 着N:M的关
系,一个V可以调用任意T,一个T可以供任意V使用

模板处理分为两个过程
①加载
②渲染

摘要

模板主要有两个部分

①HTML静态代码
②动态插入的代码段(挖坑,填坑)

模板中的动态代码段除了做基本的静态填充,还可以实现一些
基本的运算,转换和逻辑

模板中的变量

视图传递给模板的数据

遵守标识符规则
语法{{ var }}
如果变量不存在,则插入空字符串

模板中的点语法

  • 字典查询 grades grade

  • 属性或者方法 grade.gname

  • 索引 grades.0.gname

模板中的小弊端,调用对象的方法,不能传递参数

模板中的标签

  • 语法 { % tag % }
  • 作用 1. 加载外部传入的变量
    2.在输出中创建文本
    3.控制循环或逻辑

if

格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{%if 表达式%}
语句
{% endif %}


{% if表达式%}
语句
{% else %}
语句
{% endif %}


{%if表达式%}
语句
{% elif表达式%}
语句
{% endif %}

for

格式:

1
2
3
4
5
6
{%for变量in列表%}
语句1
# 当列表为空或不存在时,执行empty之后的语句
{% empty %}
语句2
{% endfor %}
  • {{ forloop.counter }}表示当前是第几次循环,从1数数
  • {{ forloop.counter0}}表示当前是第几次循环,从0数数
  • {{ forloop.revcounter}}表示当前是第几次循环,倒着数数,到1停
  • {{ forloop.revcounter0}}表示当前第几次循环,倒着数,到0停
  • {{ forloop.first}}是否是第一个布尔值
  • {{ forloop.last}}是否是最后一个布尔值

注释

  • 单行注释
    { #被注释掉的内容# }

  • 多行注释

    1
    2
    3
    {% comment %}
    内容
    {% endcomment %}

乘除

{ % widthratio 数 分母 分子 % }

整除

{ % if num|divisibleby:2 % }

ifequal

如果相等

1
2
3
{% ifequal value1 value2 %} # 如果value1等于value2
语句
{% endifequal %}

ifnotequal

如果不相等

url

反向解析
{ % url 'namespace:name' p1 p2 % }

csrf_token

用于跨站请求伪造保护的
格式{ % csrf_ token % }

过滤器

{ {var|过滤器} }
作用:在变量显示前修改

  • add 参数 加 数字相加 字符串拼接 列表拼接
    { { p.page| add:5 } }

  • 没有减法过滤器,但是加法里可以加负数
    { { p.page| add:-5} }

  • lower 小写
    { { p.pname|lower } }

  • upper 大写

    { { p.pname|upper} }

  • default:参数 变量不存在或者为空 显示默认值

  • filesizeformat 人性化显示文件大小 kb PB

  • title 首字母大写

  • ljust:20 左对齐

  • rjust:20 右对齐

  • center:20 居中

  • length 长度

  • slice:’::’ 切片

  • join:’_’ 拼接列表

  • first 取第一个元素

  • last 取最后一个元素

  • safe 取消对HTML代码的转义

  • date:’Y-m-d H:i:s’ 日期的格式化

  • truncatechars:18 文本上的时候进行截断 按18截断

过滤器可以传递参数,参数需要使用引号引起来;

比如join: { { students|join'=' } }

默认值:default,格式{ {var|default value} }

如果变量没有被提供或者为False,空,会使用默认值

根据指定格式转换日期为字符串,处理时间的就是针对date进行的转换
{ { dateVal | date:'y-m-d' } }

常见过滤器使用方法可以参照

HTML转义

将接收到的数据当成普通字符串处理还是当成HTML代码来渲染的一个问题

  • 渲染成html:{{ code |safe}}(谨慎使用)

    1
    2
    3
    {% autoescape off%}
    code
    {% endautoescape %}
  • 不想渲染

    1
    2
    3
    {% autoescape on%}
    code
    {% endautoescape %}

    CSRF

跨站请求伪造

某些恶意网站包含链接,表单,按钮,Js利用登陆用户在浏览器中的认证信息,进行非法操作,攻击服务,破坏数据

在表单中添加
{ % csrf_ _token % }
在settings中的中间件MIDDLEWARE中配置打开
'django.middleware.csrf.CsrfViewMiddleware',

模板中的继承

模板也可以继承

  • 关键字block:挖坑,用来规划布局
    • 首次出现,代表规划
    • 第二次出现,代表填充以前的规划
    • 第三次出现,代表填充以前的规则,默认动作是覆盖
      • 如果不想覆盖,可以添加{{block.super}}
      • 这样就实现了增量式操作
1
2
3
{% block XXX%}
code
{% endblock %}
  • extends继承,写在开头位置
  • { % extends '父模板路径' % }
  • include:加载模板进行渲染,可以将页面作为一部分,嵌入到其他页面中
    格式 { % include '模板文件' % }
  • block+extends
    • 化整为零
  • include+block
    • 由零聚一

注意

  • 三个标签可以和混合使用,能用block+extends搞定的,就尽量不要使用include,因为效率比较低
  • include可以单独使用
  • 如果已经继承自一个父模板,子模版重写自己的页面结构,是不会生效的,只能在已有的“坑”中写。

静态资源

在工程中一般把css,js,img等固定的资源放入新建的static文件夹,并在settings中注册

1QAXX4.png

以css为例

1QEQ9f.png

在页面的顶端导入{ % load static % }或者{ % load staticfiles % }

链接即可写成href="{ % static 'css/demo.css' % }"式的绝对路径

坑点:

  • 仅在debug模式下可以使用
  • 以后需要单独处理

思维导图

1lquE4.png