• python_django_template模块


    官方文档

    博文导航:

    定义模板:

        变量

      标签:

        if

        for

        include

        url

        csrf_token

      过滤器:

        简单过滤器

        HTML转义

        加减乘除的过滤器

      注释:

     模板继承

    模板语言:Django 模板是一些文本字符串,作用是把文档的表现与数据区分开。模板定义一些占位符和基本的逻辑(模板标签),规定如何显示文档。通常,模板用于生成HTML(Django 模板也可以生成任何基于文本的格式)。

    定义模板:

    变量:

    视图传递给模板的数据(注:变量名命名要遵守标识符命名规则)

      语法:{{ var }}

    变量用于对象的传递:

      语法:{{ stu.name }}

    变量用于调用对象的方法

      注:在模板中调用对象的方法不能传递参数!

    举个栗子:

    对应view.py文件

    from . import models
    def index(request):
        # 调用对象
        student = models.Students.stuObj.get(pk=1)
        # 将对象传入模板中
        return render(request,'myMain/index.html',{"num":3333, "stu": student})

    我们在创建数据库的Students类中增加方法getName():

    class Students(models.Model):
        # ......
        def getName(self):   # 不能传递参数!!
            return self.name   # 返回数据库中的姓名

    对应html模板

        <h1>{{ num }}</h1>
        <h1>{{ stu.name }}</h1>
        <h1>{{ stu.getName}}</h1>

     标签:在输出中创建文本,并进行控制逻辑和循环

     语法:{% tag %}

     if 语句语法:

    {% if 表达式 %}
    语句
    {% endif %}

    if-else语句:

    {% if 表达式 %}
    语句1
    {% else %}
    语句2
    {% endif %}

    if-elif语句:

    {% if 表达式1 %}
    语句1
    {% elif 表达式2 %}
    语句2
    ....
    {% else %}
    语句n
    {% endif %}

    ifequal、ifnotequal: 如果值相等、不相等

    {% ifequal 值1 值2 %}   # 如果值1等于值2则执行语句
    语句
    {% endifequal %}

    for循环语法:

    1、

    {% for 变量 in 列表 %}
    语句
    {% endfor %}

    2、

    {% for 变量 in 列表 %}
    语句1
    {% empty %}   # 列表为空或列表不存在时继承语句2
    语句2
    {% endfor %}

    3、for循环的一个用法:

    {{forloop.counter}}   # 用于for循环,表示当前是第几次循环

     举个栗子:

    对应html模板文件:

    <h1>学生列表</h1>
        <ul>
        {% for stu in students %}
            {% if forloop.counter|divisibleby:2%}    {# | 为过滤器,divisibleby:取余#}    
            <li style="color:darkred">
                {{forloop.counter}}--{{ stu.name }}--{{stu.age}}
            </li>
            {% else %}
            <li style="color:darkgreen">
                {{forloop.counter}}--{{ stu.name }}--{{stu.age}}
            </li>
            {% endif %}
        {% empty %}
            <li>目前没有学生信息</li>
        {% endfor%}
        </ul>

    对于的views.py文件:

    from django.shortcuts import render
    from . import models
    def students(request):
        list = models.Students.stuObj.all()
        return render(request,'myMain/students.html',{'students':list})

    显示结果:

     include标签:加载模板以标签内的参数渲染

      【格式:{% include '模板目录' 参数1 参数2... %}】

     url标签:反向解析

       https://www.cnblogs.com/Vera-y/p/11936683.html

    csrf_token:

    什么是csrf ?

      跨站请求伪造(某些恶意网站利用 链接/表单/按钮/js,利用登陆用户在浏览器中认证,从而攻击用户服务)

    举个例子:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>csrf_token</title>
    </head>
    <body>
    <form action="/sunck/showinfo/" method="post">
        {# {% csrf_token %} #}   {#加上了这一句是为了让我们自己可以登录进去,为了效果,这里是暂时是被注释了的#}
        姓名:<input type="text" name="username"/>
        <hr/>
        密码:<input type="password" name="passwd"/>
        <hr/>
        <input type="submit" value="登陆"/>
    </form>
    </body>
    </html>
    正版网页

    我们django若没有配置csrf, 我们便可以复制网页源代码,在本地创建文件粘贴源代码,修改form为:<form action="http://localhost:8000/sunck/showinfo/" method="post">我们再直接通过复制的页面去访问服务器,我们直接可以直接登陆进去,这就是csrf攻击。

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>csrf_token</title>
    </head>
    <body>
    <form action="http://localhost:8000/sunck/showinfo/" method="post">
        姓名:<input type="text" name="username"/>
        <hr/>
        密码:<input type="password" name="passwd"/>
        <hr/>
        <input type="submit" value="登陆"/>
    </form>
    </body>
    </html>
    盗版网页

    django如何防止csrf?

    1. 配置settings.py文件
      • MIDDLEWARE = ['django.middleware.csrf.CsrfViewMiddleware',]   # 已经默认配置完成了
    2. 在form表单下加上{% csrf_token %}语句,不加滴话,我们自己也会被当作是伪造的
    3. 没了,就是这么简单!
    注:,加上了就滴话,我们每次刷新网页,它就会给我们存一个key-value值存在cookie中,
    我们也可以通过网页 检查》network》name》cookie》request Cookie》csrftoken中查看到,
    用于服务器验证(但是我们这个key-value值要是被有心人在网页中,找到它也有可能能恶意的登陆进网站)
    所以我们这也不是绝对的安全,更加安全的方式是通过验证码(https://www.cnblogs.com/Vera-y/p/11938452.html

    加上{%csrf_token%}的网页源代码效果:

    过滤器:在变量显示前修改它

    语法:{{ var | 过滤器}}

    简单过滤器:

    • lower:全变为小写 
    • upper:全变为大写
    • divisibleby:取余【格式:{{被取余值 | 取余值}}】(4%2)
    • default:若一个变量没有被提供,即获取值为false/空,则可设置默认值default
    • date:根据给定格式转换日期为字符串【格式:{{dateVal | date:'y-m-d'}}】

    过滤器方法:可用于参数的传递(参数用‘’ 引起来)

    举个栗子:

    对应html文件

    <div>{{ str }}</div>
    <div>{{ str|upper}}</div>
    <div>{{ list|join:'#' }}</div>    <!--其中个# 就为传递的参数(表示用# 连接为字符串)-->
    <div>{{ test | default:'我啥也没有'}}</div>

    对应views.py 文件

    return render(request,'myMain/students.html',{'str':"baby is girl",'list':['good','nice','yemade'],'test':False})

    显示结果:

    baby is girl
    BABY IS GIRL
    good#nice#yemade
    我啥也没有

    HTML转义:将接收到的字符串当作HTML代码渲染

    什么是HTML转义?    

      我们浏览器接收到views.py中return render(request,'myMain/students.html',{"code":"<h1>baby is girl</h1>"})时,code变量是一个字符串,我们浏览器渲染它滴时候就不作任何操作,也就是直接把它当作普通字符串显示,而我们HTML转义勒,就是把我们接收到的字符串当作html代码渲染。

    渲染的两种方式:

    • 过滤器:safe(不转义)/escape(转义)
    • 标签:autoescape

    举个栗子:

    {#以普通字符串的格式显示#}
    {{code|safe}}
    {#进行HTML渲染#}
    {{code|escape}}
    {#这里的on表示打开HTML转义,off表示关闭HTML转义,以普通字符串的形式显示#} {% autoescape on%} {{code}} {% endautoescape%}

    加减乘除的过滤器

    举个栗子:

    对应html模板

        <h1>num = {{num}}</h1>
        <h1>num1 = {{num | add:10}}</h1>
        <h1>num2 = {{num | add:-5}}</h1>
        <!--相当于num/1*5 (乘5)-->
        <h1>num3 = {% widthratio num 1 5 %}</h1>
        <!--相当于num/5*1(除5)-->
        <h1>num4 = {% widthratio num 5 1 %}</h1>

    对应views.py文件

        return render(request,'myMain/students.html',{'num':10})

    显示结果:

    num = 10
    num1 = 20
    num2 = 5
    num3 = 50
    num4 = 2

     注释:

     单行注释:

      {# 注释内容 #} 

     多行注释:关键字comment

      {% comment %}

      注释内容

      {% endcomment %}

    模板继承:减少页面内容的重复定义,实现页面的重用

    block标签:在模板中预留区域,子模板去填充

    语法:

    {% block 标签名 %}
    {% endblock 标签名 %}

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

    语法:

    {% entends '父模板路径'%}

    注:标签名符合命名规则

    举个栗子:

    父模板:(一般基础模板叫base.html)

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>父模板</title>
        <style>
            #header{
                width:100%;
                height:100px;
                background-color:palevioletred;
            }
            #footer{
                width:100%;
                height:100px;
                background-color: aquamarine;
            }
        </style>
    </head>
    <body>
        <div id="header">header</div>
        <div id="content">
            {% block main%}
    
            {% endblock main%}
            <hr/>
            {% block main-one%}
    
            {% endblock main-one%}
        </div>
        <div id="footer">footer</div>
    
    </body>
    </html>
    base.html

    继承父模板:

    {% extends 'myMain/base.html' %}
    
    {% block main %}
        <h1>baby is girl</h1>
    {% endblock main %}
    
    {% block main-one %}
        <h1>uncle is boy</h1>
    {% endblock main-one %}
    子模板

    注:俺们可以有很多个子模板 (要运行看效果,记得写url.py/views.py)

  • 相关阅读:
    day06_02 继承
    day06_03 多继承区别
    day03_04 字符集编码转换
    day04_03 序列化与反序列化
    day04_06 单线程生成器的并行效果(协程)
    day04_02 装饰器 高阶版
    day04_05 内置方法
    复合控件的开发心得
    从子节点找父节点的循环sql
    asp中试用存储过程
  • 原文地址:https://www.cnblogs.com/Vera-y/p/11930845.html
Copyright © 2020-2023  润新知