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')
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容