django——模板层

模板层

目录

  • 模板语法传值
  • 模板语法传值的范围
  • 模板语法过滤器
  • 模板语法标签
  • 自定义标签函数、过滤器、inclusion_tag
  • 模板的继承
  • 模板的导入

模板语法传值

  • 模板语法传值有两种方法

    1. 指名道姓的传值

      优点:指名道姓的传参,不浪费资源

      缺点:当参数多的时候,全传入过于繁琐

      def modal(request):
          name = 'jason'
      return render(request, 'modal.html', {'name':name}) 
      
    2. 关键字locals()

      优点:将整个局部名称空间中的名字去全部传入简单快捷

      缺点:当只用较少的数据类型时,浪费资源

      def modal(request):
          name = 'jason'
          age = 18
          gender = 'male'
      return render(request, 'modal.html', locals()) 
      

      locals()是将局部名称空间中的所有的名称全部传给modal.html页面

  • 模板语法传值的范围

    1. 基本数据类型直接传递使用

    2. 函数名的传递会自动加括号执行并将返回值展示到页面上

      注意函数如果有参数则不会执行也不会展示 模板语法不支持有参函数

    3. 类名的传递也会自动加括号产生对象并展示到页面上

    4. 对象的传递则直接使用即可

      模板语法会判断每一个名字是否可调用 如果可以则调用!!!

    django的模板语法在操作容器类型的时候只允许使用句点符

    在用点的时候,django会自动判断的,

    如若是字典的键,则直接点键就等得出

    若是列表,则用点索引的方式得出,还可以连续的点

模板语法过滤器

模板语法过滤器 类似于python中的内置函数

def modal(request):
    i = 123
    
    s = 'hello world'
   
    obj = MyClass()
    from datetime import datetime
    res = datetime.today()
    
    file_size = 214324322432344353234
    
    l = [11, 22, 33]
    
    s1 = 'my name is jason my age is 18 hahaha heiheihei hehehe'
    
    """有时候html页面上的数据不一定非要在html页面上编写了 也可以后端写好传入"""
     from django.utils.safestring import mark_safe
    script_tag1 = '<script>alert(666)</script>'
    res = mark_safe(script_tag1)
    
    return render(request,'modal.html',locals())

​ html页面上的数据不一定非要在html页面上编写了 也可以后端写好传入

  • 过滤器

    模板语法过滤器是将获取的数据,传递到所需要的html文件中,从中使用过滤器获取所需的数据
    | 过滤器 | 方法 |
    | :------: | :-------------------------------------------------------: |
    | 统计长度 | {{ s | length }} |
    | 加法运算 | {{ 整型 | add: 数值 }}
    {{ 字符型 | add: '字符串' }} |
    | 日期转换 | {{ res | date:' Y-m-d H:i:s' }} |
    | 文件大小 | {{ file_size | filesizeformat }} |
    | 数据切片 | {{ l | slice:'0:10' }} |
    | 字符截取 | {{ s1 | truncatechars:6 }} |
    | 单词截取 | {{ s1 | truncatewords:6 }} |
    | 语法转移 | {{ script_tag1 | safe }} |

​ 语法转移的时候,在后端得到数据转移到html文件需要调用 make_safe来确认此次转移操作,不做确认的话,默认是不能转义的

  • django模板语法中的符号

    django模板语法中的符号就两个 一个{{}} 一个{%%}

    需要使用数据的时候 {{}}
    需要使用方法的时候

模板语法标签

模板语法的标签类似于python中的流程控制

  • if判断

    {% if 条件 %}  条件一般是模板语法传过来的数据  直接写名字使用即可
    	条件成立执行的代码
    {% elif 条件1 %}
    	条件1成立执行的代码	
    {% else %}
    	条件都不成立执行的代码
    {% endif %}  结束判断指示符
    
  • for循环

        {% for i in s %}
            {% if forloop.first %}
                <p>这是第一次哟~</p>
            {% elif forloop.last %}
                <p>这是最后一次!</p>
            {% else %}
                <p>{{ i }}</p>
            {% endif %}   # 结束判断
            {% empty %}   # 避免没传入值而报错
            	  <p>你给我的是个空 怎么for循环呢</p>
        {% endfor %}	# 结束for循环
    

自定义标签函数、过滤器、inclusion_tag

  • 自定义标签的前提

    ​ 1.在应用下创建一个名为templatetags文件夹

    ​ 2.在该文件夹创建任意名称的py文件

    ​ 3.在该py文件内编写自定义相关代码

    from django.template import Library
    register = Library()    
    

    register为safe内置函数中所定义的装饰器

  • 自定义过滤器

    过滤器最多只能有两个参数

    @register.filter(name='myfilter')
    def my_add(a, b):
        return a + b
    

    如何使用:

    在django中的任意html界面中引入自定义的过滤器

    {% load 过滤器所在的文件命 %}
    {{ i| myfilter:1 }}
    
  • 自定义标签函数

    当过滤器的参数多于两个的情况下,需要设置标签函数

    @register.simple_tag(name = 'mt')
    def func(a,b,c,d):	# 此时的参数可以为任意个数
        return a=b=c=d
    

    如何使用:

    在django中的任意html界面中引入自定义的标签函数

    {% mt 标签函数中所使用的参数(不限量) %}
    { % mt a,b,c,d }
    
  • 自定义inclusion_tag

    @register.inclusion_tag(filename='it.html')
    def index(n):
        html = []
        for i in range(n):
            html.append('第%s页'%i)
        return locals()  # 把html这个列表传给 filename='it.html' 
    

    在it.html页面

    <ul>
        {% for i in html %}
            <li>{{ i }}</li>
        {% endfor %}
    </ul>
    渲染标签
    

    最后再在所需要调用的html界面设置

     {% index 10 %}
    

模板的继承

如若模板界面类似,可直接利用django的特性,直接继承主界面的所有网页界面

  • 使用的方法:

    将创建的文件所有东西删除掉之后,使用{% extends 'html文件名' %}方法
    可直接继承以写好的网页代码
    
  • 继承之后需要做出修改

    1. 在母板界面(被继承的页面)
    在所需要做出的修改的地方做出操作
    {{% block 名字 %}
        模板内容
     {% endblock %}}
    2.在子板界面(继承的界面)
    	{% block 名字 %}
        	子板内容
        {% endblock %}
    

    由此方法可以在继承的基础之上,在另一页面对所引的界面 内容做出大致更改

    其他地方不会做出改变

    一般情况下母板中至少应该有三个区域(css 、content 、js)使得扩展性更高!!!

  • 继承之后可以利用母板的三个区域做出自身子板的样式更改

    1.css样式更改
    {% block css %}
    	css样式
    {% endblock %}
    
    2.content 样式更改
    {% block content %}
    	content 样式
    {% endblock %}
    3.js样式更改
    {% block js %}
    	js样式
    {% endblock %}
    

    子板中还可以使用母板的内容 {{ block.super }}

模板的导入

​ 将html页面的某个部分当做模块的形式导入使用

设置好一个模块的样式,然后在html文档中使用

 {% include 'html文件名' %} 

可直接在此html文件中的某一模块置换成所导入的模块的样式

posted @ 2022-09-03 16:26  Nirvana*  阅读(53)  评论(0)    收藏  举报