zoukankan      html  css  js  c++  java
  • django 模板使用

    模板
        定义模板
            变量
                变量传递给模板的数据
                要遵守标识符规则
                语法 {{ var }}
                注意:如果使用的变量不存在,则插入的是空字符串
                在模板中使用点语法
                    字典查询
                    属性或者方法
                    数字索引
                在模板中调用对象的方法
                    注意:在模板里定义的函数不能传递self以外的参数
            标签:语法   {% tag %}
                作用
                    在输出中创建文本
                    控制逻辑和循环
            标签示例:    
                if 格式 
                        {% if 表达式 %}
                            语句
                        {% endif %}
                if-else 格式   
                            {% if 表达式 %}
                                语句1
                            {% else %}
                                语句else
                            {% endif %}
                if-elif-else 格式 
                            {% if 表达式 %}
                                语句1
                            {% elif 表达式 %}
                                语句2
                            ...
    
                            {% else %}
                                语句else
                            {% endif %}
                for 格式
                        {% for 变量 in 列表 %}
                            语句
                        {% endfor %}
                    格式2
                        {% for 变量 in 列表 %}
                            语句
                        {% empty %}  # 注意:列表为空或者列表不存在时执行语句2
                            语句2
                        {% endfor %}
                    格式3
                        {{ forloop.counter }}
                    示例:
                        <ul>
                            {% for stu in students %}
                                <li>
                                    {{forloop.counter}}--{{stu.sname}}--{{stu.sgrade}}
                                </li>
                            {% empty %}
                                <li>目前没有学生</li>
                            {% endfor %}
                commnet 格式
                    {% commnet %}
                        被注释的内容
                    {% endcomment %}
                    作用:相当于多行注释,被注释的内容不再执行
                ifequal/ifnotequal 作用 判断是否相等或者不相等
                    格式
                        {% ifequal 值1 值2 %}
                            语句1
                        {% endifequal %}  # 如果值1等于值2,执行语句1,否则不执行语句1
                include
                    作用:加载模板并以标签内的参数渲染
                    格式:{% include '模板目录' 参数1 参数2 %}
                url
                    作用:反射解析
                    格式:{% url 'namespace: name' p1 p2 %}
                csrf_token
                    作用:用于跨站请求伪造保护
                    格式:{% csrf_token %}
                block, extends
                    作用:用于模板的继承
                autoescape
                    作用:用于HTML转义
            过滤器
                语法 {{ var|过滤器 }}
                作用:在变量被显示前修改它,只是加一个效果,对变量不会造成影响
                示例:
                    lower
                    upper
                过滤器可以传递参数,参数用引号引起来
                    join 格式 列表|join:"#"
                         示例:{{list1|join:"#"}}
                如果一个变量没有被提供,或者值为false,空,我们可以通过 default 语法使用默认值
                    格式: {{str1|default:"没有"}}
                根据给定格式转换日期为字符串:date
                    格式: {{dateVal|date:'y-m-d'}}
                HTML转义:escape
                加减乘除示例:
                    <h1>num = {{num|add:10}}</h1>
                    <h1>num = {{num|add:-10}}</h1>
                    <h1>num = {% num widthratio num 1 5%}</h1>
                    <h1>num = {% num widthratio num 5 1%}</h1>
            注释
                单行注释:语法: {# 被注释的内容 #}
                多行注释
                    {% commnet %}
                        被注释的内容
                    {% endcomment %}
    
        反射解析
            示例:
                project/project/urls.py
                url(r'^', include('myApp.urls', namespace='app')),
                project/myApp/urls.py
                url(r'^good/(d+)$', views.good, name="good")
                templates/good.html
                <a href={% url 'app:good' 1 %}>链接</a>
    
        模板继承
            作用:模板继承可以减少页面的重复定义,实现页面的重用
            block标签:在父模板中预留区域 ,子模板去填充
                语法 : {% block 标签名 %}
    
                        {% endblock 标签名 %}
            extends标签:继承模板,需要写在模板文件的第一行
                语法 : {% extends 'myApp/base.html' %}
                        {% block main %}
                            内容
                        {% endblock 标签名 %}
            示例:
                定义父模板
                    body标签中
                    {% block main %}
                            
                    {% endblock main %}
    
                    {% block main %}
                            
                    {% endblock main2 %}
                定义子模板
                    {% extends 'myApp/base.html' %}
                    {% block main %}
                        <h1>sunck is a good man</h1>
                    {% endblock main %}
    
                    {% block main2 %}
                        <h1>kaige is a good man</h1>
                    {% endblock main2 %}
    
        HTML转义
            问题:return render(request, 'myApp/index.html', {"code": "<h1>sunck is a very good man</h1>"})中的{{code}}
                  {{code}}里的code被当作<h1>sunck is a very good man</h1>显示,未经过渲染
            解决方法:
                {{code|safe}}
            或  {% autoescape off %}
                    {{code}}
                {% endautoescape %}  # 这个可以一口气解决一堆
    
        CSRF:
        跨站请求伪造
            某些恶意网站包含链接,表单,按钮,js,利用登录用户在浏览器中认证,从而攻击服务
        防止CSRF
            在settings.py文件的MIDDLEWARE增加'django.middleware.csrf.CsrfViewMiddleware'
            {% csrf_token %}        
    
        验证码
            作用
                在用户注册,登录页面的时候使用,为了防止暴力请求,减轻服务器的压力
                是防止CSRF的一种方式
    
        验证码代码示例:
    写在views.py里面
    =================================================================================================
    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))]
        # 构造字体对象
        font = ImageFont.truetype(r'C:WindowsFontsAdobeArabic-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))
        # 绘制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
        # 存入session,用于做进一步的验证
        request.session['verifycode'] = rand_str
        # 内存文件操作
        import io
        buf = io.BytesIO()
        # 将图片保存在内存中,文件类型为png
        im.save(buf, 'png')
        # 将内存中的图片数据返回给客户端,MIME类型为图片png
        return HttpResponse(buf.getvalue(), 'image/png')
    
    
    from django.shortcuts import render, redirect
    def verifycodefile(request):
        f = request.session["falg"]
        str = ""
        if f == False:
            str = "请重新输入!"
        request.session.clear()
        return render(request, 'myApp/verifycodefile.html', {"flag":str})
    
    def verifycodecheck(request):
        code1 = request.POST.get("verifycode").upper()
        code2 = request.session["verify"].upper()
        if code1 == code2:
            return render(request, 'myApp/success.html')
        else:
            request.session["flag"] = False
            return redirect('/verifycodefile')
    
    ==============================================================================
    写在verifycodefile.html的<body>标签中
    <body>
        <form method="post" action="/verifycodecheck/">
            {%csrf_token%}
            <input type="text" name="verifycode"/>
            <img src="/verifycode">
            <input type="submit" name="登录">
            <span>{{flag}}</span>
        </form>
    </body>
    
    ==============================================================================
    
  • 相关阅读:
    二叉树的存储结构
    面试Java需要的知识总结
    EJB总结
    WEB 容器、WEB服务和应用服务器的区别与联系
    Linux安装JBOSS
    JBOSS和WebLogic区别
    深入浅出JMS(一)--JMS基本概念
    Java缓冲流细节
    xor和路径(codevs 2412)
    外星千足虫(bzoj 1923)
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/10356771.html
Copyright © 2011-2022 走看看