Django模板层的扩展

模板层

模板,其实就是一个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}}:表示循环的第几次

例:

<ul> 
{% for stu in students %} 
    <li>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li> 
{% empty %} 
    <li>目前没有学生</li> 
{% endfor %} 
</ul>

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\test.html', {'str': 'sbc'})

r我在HTML文件中获取文件时只需要使用{{str}}即可将变量的值取出来。如果使用过滤器,取值方式如下:

<h1>{{str|upper}}</h1>

常用过滤器:power/upper/default/date/join

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

<h1>{{list|join:’,’}}</h1>

如果一个变量没有被提供,或者值为false、空,可以使用默认值
格式:{{var|default:’没有’}}

根据给定格式转换日期为字符串
 Date:格式:{{dateVal|date:’y-m-d’}}

HTML转义:escape
加减乘除:

<h2>{{num|add:-10}}</h2><h2>{% widthratio num 1 5 %}</h2># (num/1)*5

奇偶行换色 

<ul> 
{% for stu in students %} 
    {% if forloop.counter | divisibleby:2 %} 
        <li style='color:red'>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li> 
    {% else %} 
        <li style='color:blue'>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li> 
    {% endif %} 
{% empty %} 
    <li>目前没有学生</li> 
{% endfor %} 
</ul>

注释

单行注释

{# 注释的内容 }

多行注释

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

反向解析

链接 此时如果url正则变了,那么所有的链接就都要修改。使用反向解析可以解决这个问题 Project下的urls

url(r’^’, include(‘app.urls’, namespace=’something’)) 

app下的urls文件

url(r’^good/$’,views.good. name=’good’) 

页面链接

<a href=’{% url ‘something:good’%}’>

此时,无论怎么修改url正则,都不会影响页面中的任何url

模板继承

作用:模板继承可以减少页面的内容的重复定义,实现页面的重用 Block标签:在父模板中预留区域,子模板去填充

语法:{% block 标签名 %}{% endblock 标签名%}

一个模板中可以定义多个block块

Extends标签:继承模板,需要写在模板文件的第一行

语法:{% extends ‘父模板路径’ %}

示例:

定义父模板: base.html:

<body>
<div id = ‘header’></div>
<div id=‘main’>
	{% block main %}

    {% endblock main%}
</div>
<div id= ‘footer’></div>
</body>

定义子模板: index.html:

{% extends ‘base.html’%}
{% block main%}
	<h2>you are the best!!!</h2>
{% 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 
    # 定义变量,用于画面的背景色、宽、高 
    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'C\Windows\Fonts\AdobeArabic-Bold.otf', 40) 
    # 构建字体颜色 
    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')

 

转载于:https://my.oschina.net/epoch/blog/1796997

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值