django 模版-标签-视图-csrf-token-模版继承-HTML过滤器

"""
******模版******

--定义模版--
**变量**
视图传递给模版的数据
注意1:要遵守标识符规则
语法:{{var(即变量)}}
如果使用的变量不存在,则插入的是空字符串
在模版中使用点的语法,
1.先当字典查询来处理
2.属性或者方法
3.数字索引
举例:
VIEWS中定义如下:
def index11(request):
    student = Students.objects.get(pk=1)
    return render(request,'users/index11.html',{'stu':student})
模版中调用如下:
<h1>{{ stu.sname }}</h1>


在模版中调用对象的方法:
1.在models中定义一个方法
def getName(self):
    return self.sname
2.views中定义如下:
def index11(request):
    student = Students.objects.get(pk=1)
    return render(request,'users/index11.html',{'stu':student})
模版中调用如下:
<h1>{{ stu.getName }}</h1>
注意:模版不能传递附加的参数
在models中定义一个方法如下,以下这样的方式是不可以的
def getName(self,str):
    return self.sname+str



**标签**
语法:{% tag %}
作用:
1.在输出中创建文本
2.控制逻辑和循环
if
格式1:
{% if 表达式 %}
语句
{% endif %}
格式2:
{% if 表达式1 %}
语句1
{% else %}
语句2
{% endif %}
格式3:
{% if 表达式1 %}
语句1
{% elif 表达式2%}
语句n
{% else %}   #这个可有可无
语句e
{% endif %}
示例:
{% if num %}
    <h1>hello world</h1>
{% endif %}

for
格式1:
{% for 变量 in 列表 %}
语句1
{% empty %}  #这个可有可无,这个是列表为空或者列表不存在,执行语句2
语句2
{% endfor %}

格式2:
{% for 变量 in 列表 %}
语句1
{% endfor %}

格式3:
{{forloop.counter}}   #表示当前是第几循环
示例1:
{% for line in studdd %}
    <li>{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
{% empty %}
    <li>目前没有学生</li>
{% endfor %}
示例2:
{% for line in stud %}
    {% if forloop.counter|divisibleby:2 %}
        <li style="color:red">{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
    {% else %}
        <li style="color:blue">{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
    {% endif %}
{% empty %}
    <li>目前没有学生</li>
{% endfor %}


comment
作用:注释多行,不紧可以注释标签,也可以注意变量
格式:
{% comment%}
<h1>学生</h1>
{{stu.student}}
{%endcomment%}
单行注释用: {# 注释内容 #}

ifequal/ifnotequal
作用:判断是否相等或者不相等
格式:
{% ifequal 值1 值2%}  #如果值1与值2相等就执行下面的语句,不相等就不执行
语句
{% endifequal %}
示例:
{% ifequal 'ok' 'ok' %}
    <h1>学生要加油</h1>
{% endifequal %}

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

url
作用:反向解析
格式:{% url 'namespacename' p1 p2 %}
主url
urlpatterns = [
    # path('admin/', admin.site.urls),
    url(r'^',include('users.urls',namespace='app')),
]
次url
app_name ='app3'
urlpatterns = [
    url(r'^food/(\d+)/(\d+)/$', views.good,name='good'),
]
视图views
def good(request,id,id3):
    return render(request,'users/good.html',{'num':id,'num3':id3})
html中
<a href="{% url 'app:good' 5 3%}">跳转</a>
跳转到good.html
<h1>{{ num }}</h1>
<h1>{{ num3 }}</h1>


csrf_token
作用:用于跨站请求伪造保护
某些网站包含链接、表单、按钮、JS会利用我们登陆的用户在浏览器中认证,从而攻击服务
防止csrf有两种方法
第一种:
1.在setting中MIDDLEWARE里加上'django.middleware.csrf.CsrfViewMiddleware',
2.在表单中{% csrf_token %}
第二种:
验证码:在用户注册,登陆页面时候使用,为了防止暴力请求,减轻服务器的压力,防止CRSF一种方式!
1.安装pillow模块
2.在views中配置一个def ,如下代码,用于生成图片验证码的函数
# -*- coding:utf-8 -*-
from django.shortcuts import HttpResponse
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 = '1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
    #随机选取4个值作为验证码
    rand_str = ''
    for i in range(0,4):
        rand_str += str[random.randrange(0,len(str))]
    #构造字体对象 把C盘的字体文件放到其它盘,因为C盘字体文件路径不好找
    font = ImageFont.truetype("E:\simsunb.ttf", 36)
    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))
    #绘制4个字
    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
    # request.session['verifycode'] = rand_str
    #内存文件操作
    import io
    buf = io.BytesIO()
    #将图片保存在内存中,文件类型为png
    im.save(buf,'png')
    #将内存中的图片数据返回给客户端,MIME类型为图片png
    return HttpResponse(buf.getvalue(),'image/png')
#备注:
# code1 = request.session['verify'] 【登录获取图片上的验证码】
#code2 = request.POST.get('verifycode') 【获取登录表单上输入的验证码】
3.配置url
    url(r'^verifycode/$',views.verifycode),
    url(r'^verifycodefile/$',views.verifycodefile),
    url(r'^verifycodecheck/$',views.verifycodecheck),
4.创建html
<body>
    <form action="/verifycodecheck/" method="post">
        {% csrf_token %}
        <input type="text" name="yanzheng" />
        <img src="/verifycode/">
        <input type="submit" value="登陆" />
        <span>{{ flag }}</span>
    </form>
</body>
5.再次配置views
from django.shortcuts import redirect
def verifycodefile(request):
    ff = request.session.get('shibai',True)
    str = ''
    request.session.clear()
    if ff == False:
        str = "验证码输入错误,请重新输入"
    return render(request,'users/verifycodefile.html',{'flag':str})

def verifycodecheck(request):
    code1 = request.POST.get('yanzheng').upper()
    code2 = request.session['verifycode'].upper()
    print(code1,code2)
    if code1 == code2:
        request.session.clear()
        return render(request,'users/succese.html')
    else:
        request.session['shibai']= False
        return redirect('/verifycodefile/')




模版继承
作用:模版继承可以减少页面内容的重复定义,实现页面的重用
block标签  在父模版中预留区域,子模版去填充
语法:
{% block 标签名 %}
{% endblock 标签名 %}
父模版:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #header{
            width:100%;
            height: 100px;
            background-color:red;
        }
        #footer{
            width:100%;
            height: 100px;
            background-color:blue;
        }
    </style>
</head>
<body>
    <div id = "header">header</div>
    <div id = "main">
        {% block main%}
        {% endblock main %}
        <hr/>
        {% block main2%}
        {% endblock main2 %}
    </div>
    <div id = "footer">footer</div>
</body>
</html>

extends标签  继承模版,需要写在模版文件的第一行
语法:
{% extends 'users/base.html' %}
{% block main %}
    <h1>ok,my</h1>
{% endblock main %}
{% block main2 %}
    <h1>suck,is kaige</h1>
{% endblock main2 %}


HTML转义
举例:
return render(request,'users/index11.html',{'code':'<h1>suck is hao de </h1>'})

<h1>{{ code|safe }}</h1>  #转义一个
#下面是同时转义多个
<h1>
    {% autoescape off %}
        {{ code }}
    {% endautoescape %}




**过滤器**
语法:{{var(即变量)|过滤器}}
作用:再变量被显示前修改它
过滤器的种类:
一、lower 小写
二、upper 大写 例:<h1>{{ str|upper }}</h1>
三、过滤器可以传递参数,参数用引号引起来:
1.join  格式  列表|join:'#'   列表|join:'连接的东西'
例:<h1>{{ list|join:'#' }}</h1>
四、如果一个变量没有被提供,或者值为False,空,可以使用默认值
1.default
格式:{{var|default:'good'}}
例:<h1>{{ lis4t|default:'godd' }}</h1>
五、根据给定的格式转换日期为字符串
1.date
格式:{{ dateval|date:'y-m-d'}}
六、HTML转义
1.escage
七、加减乘除
<h1>{{ num|add:10 }}</h1>
<h1>{{ num|add:-5 }}</h1>
<!--num/1*5(num除以1乘5)后面必须带两个值,格式规定-->
<h1>{% widthratio num 1 5%}</h1>
<!--num/5*1(num除以5乘1)-->
<h1>{% widthratio num 5 1%}</h1>

标签:include
加载模板(带参数渲染)
格式:{% include '模板位置' with 参数1 参数2 参数3..... %}
举例:{% include 'index_context.html'%}


"""

 

posted @ 2019-02-16 18:28  代码家园  阅读(268)  评论(0编辑  收藏  举报