Django模板层的扩展

2019-04-13 17:26发布

模板层

模板,其实就是一个HTML页面,我们只不过是,通过一些标签对其进行数据的渲染最终展示给用户的内容。而对于模板层,我们主要的精力不在HTML上,而是在标签上

变量

视图传递给模板的数据,可以是一个数据,也可以是一个对象 def start(request): title = "欢迎学习django" lists = [1, 2, 3] return render(request, 'userInfo\add_user.html', {'title': title, 'list': lists}) 遵守标识符规则
语法:{{var}} -> {{num}}
注意:如果使用的变量不存在,则插入的是空字符串。
在模板中使用 . 语法 {{stu.name}}: 使用.语法,要是字典类型,或者是对象中的属性或者方法
在模板中调用方法:{{stu.getName}}
注意,在模板中调用方法,不能传递参数。

标签

语法:{% tag %}

if标签:逻辑判断语句

在输出中用判断一些关系,来决定数据的不同处理方式 格式: {%if 表达式 %} 语句1 {% elif 表达式 %} 语句2 {% else %} 语句3 {% endif %}

for 标签:循环语句

循环语句就是将字典或者是列表中的数据一条一条的迭代出来。 格式: {% for 变量 in 列表 %} 语句1 {% empty %} 语句2 {% endfor %} 注意 : 列表为空或者是列表不存在的时候,执行语句2 {{ forloop.counter}}:表示循环的第几次 例:
    {% for stu in students %}
  • {{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}
  • {% empty %}
  • 目前没有学生
  • {% endfor %}

comment标签

多行注释 格式: {% comment %} 这里是注释的内容, 不会显示在页面中, 而且可以是多行。 {% endcomment %}

ifequal/ifnotequal

判断是否相等或者不相等 格式: {% ifequal 值1 值2 %} 语句 {% endifequal %} {% ifnotequal 值1 值2 %} 语句1 {% endifequal %} 如果值1 和值2相等,执行语句 如果值1和值2不相等,执行语句1

include 标签

加载模板并以标签内的参数渲染 格式: {% include '模板目录' 参数1 参数2 %}

url 标签

url标签是用来做动态url的,需要配置工程配置目录中的url中定义的namaspace以及namespace中配置的app中的url中所对应的name来进行合成url,后边的参数 p1 p2 是在URL中的参数,如果有多个,就依次用空格分开,没有就不需要写。 格式: {% url 'namespace:name' p1 p2 %}

csrf_token 标签

用于跨站请求伪造保护的 格式: {% csrf_token %} 此处的标签很简单,就是将原木原样的标签放入到for表单中的任意位置即可。

block/extends标签

用于模板的继承

autoescape 标签

作用于HTML转义

过滤器

在变量显示前修改它 语法{{var | 过滤器 }} 假设我在视图中返回一个字符串,都是小写字母。 def test(request): return render(request, 'pages est.html', {'str': 'sbc'}) r我在HTML文件中获取文件时只需要使用{{str}}即可将变量的值取出来。如果使用过滤器,取值方式如下:

{{str|upper}}

常用过滤器:power/upper/default/date/join 过滤器可以传递参数,参数用引号引起来.
join:格式:列表|join:’#’
示例:

{{list|join:’,’}}

如果一个变量没有被提供,或者值为false、空,可以使用默认值
格式:{{var|default:’没有’}} 根据给定格式转换日期为字符串
Date:格式:{{dateVal|date:’y-m-d’}} HTML转义:escape
加减乘除:

{{num|add:-10}}

{% widthratio num 1 5 %}

# (num/1)*5
奇偶行换 {MOD}
    {% for stu in students %} {% if forloop.counter | divisibleby:2 %}
  • {{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}
  • {% else %}
  • {{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}
  • {% endif %} {% empty %}
  • 目前没有学生
  • {% endfor %}

注释

单行注释

{# 注释的内容 }

多行注释

{% comment %} dfg dfggh gh {% endcomment %}

反向解析

链接 此时如果url正则变了,那么所有的链接就都要修改。使用反向解析可以解决这个问题 Project下的urls url(r’^’, include(‘app.urls’, namespace=’something’)) app下的urls文件 url(r’^good/$’,views.good. name=’good’) 页面链接 此时,无论怎么修改url正则,都不会影响页面中的任何url

模板继承

作用:模板继承可以减少页面的内容的重复定义,实现页面的重用 Block标签:在父模板中预留区域,子模板去填充
语法:{% block 标签名 %}{% endblock 标签名%}
一个模板中可以定义多个block块 Extends标签:继承模板,需要写在模板文件的第一行
语法:{% extends ‘父模板路径’ %}
示例: 定义父模板: base.html:
{% block main %} {% endblock main%}
定义子模板: index.html: {% extends ‘base.html’%} {% block main%}

you are the best!!!

{% block main%}

HTML转义

后台传过来的HTML代码字符串,如果不转义,他就会当成普通字符串渲染。 将接收到的HTML字符串解析成HTML进行渲染 {{code}} {{code|escape}} {{code|safe}} {% autoescape off %} {{code}} {% endautoescape %}

csrf跨站请求伪造

某些恶意网站包含链接、表单、按钮、js,利用登录用户在浏览器中认证从而攻击服务。 防止CSRF: 在settings.py文件中的中间件配置增加csrf的配置,默认配置好了。但是加完了,自己也登录不了了。 我们自己访问,需要在我们的表单中添加{% csrf_token %}

验证码

def verifycode(request): # 引入绘图模块 from PIL import Image, ImageDraw, ImageFont # 引入随机函数模块 import random # 定义变量,用于画面的背景 {MOD}、宽、高 bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100)) width = 100 height = 50 # 创建画面对象 im = Image.new('RGB',(width, height),bgcolor) # 创建画笔对象 draw = ImageDraw.Draw(im) # 调用画笔的point()函数绘制噪点 for i in range(0, 100): xy = (random.randrange(0, width), random,randrange(0, height)) fill = (random.randrange(0, 255), 255, random.randrange(0, 255)) draw.point(xy, fill=fill) # 定义验证码的备选值 str = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM' # 随机选取四个值作为验证码 rand_str = '' for i in range(0,4): rand_str += str[random.randrange(0, len(str))] # 构建字体对象 font = ImageFont.truetype(r'CWindowsFontsAdobeArabic-Bold.otf', 40) # 构建字体颜 {MOD} fontcolor1 =(255, random.randrange(0, 255), random.randrange(0, 255)) fontcolor2 =(255, random.randrange(0, 255), random.randrange(0, 255)) fontcolor3 =(255, random.randrange(0, 255), random.randrange(0, 255)) fontcolor4 =(255, random.randrange(0, 255), random.randrange(0, 255)) # 绘制四个字 draw.text((5, 2), rand_str[0], font=font, fill=fontcolor1) draw.text((25, 2), rand_str[1], font=font, fill=fontcolor2) draw.text((50, 2), rand_str[2], font=font, fill=fontcolor3) draw.text((75, 2), rand_str[3], font=font, fill=fontcolor4) # 释放画笔 del draw # 存入session , 用于做进一步验证 request.session['verifycode'] = rand_str # 内存文件操作 import io buf = io.BytesIO() # 将图片保存在内存中,文件类型为png im.safe(buf, 'png') # 将内存中的图片数据返回给客户端,MIME类型为图片png return HttpResponse(buf.getValue(), 'image/png')