zoukankan      html  css  js  c++  java
  • 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{
                100%;
                height: 100px;
                background-color:red;
            }
            #footer{
                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'%}
    
    
    """
  • 相关阅读:
    javascript如何实现图片隐藏?
    TypeScript数字分隔符和更严格的类属性检查
    JS 原生闭包模块化开发总结
    详解浏览器储存
    对象扩展运算符和 rest 运算符及 keyof 和查找类型
    Js实现动态轮播图效果
    javascript选择器有哪些?
    javascript的事件流模型都有什么?
    理解JavaScript中的语法和代码结构
    14. Cantor表
  • 原文地址:https://www.cnblogs.com/weilaibuxiangshuo/p/10388700.html
Copyright © 2011-2022 走看看