django 05 模板层

模板层语法传值

复制代码
# 1.模板语法传值有两种方式
      {{}}:     主要与数据值有关的传值
      {%%}:   主要与逻辑相关的传值
      """django的模板语法是自己写的,与jinja2不同"""
       -1.针对于需要加括号调用的名字,django模板语法填写无需加括号,只写名字就会直接调用
       -2.模板语法的注释无法在前端查看到
               注释语法: {##}


# 2.模板语法传值
     传值方式1:精准传值不浪费资源,但是对于传递值多的比较麻烦
          return render(request, 'html页面',{'name': name, 'age' = age})
     传值方式2:将函数名称空间中所有的名字全部传递出去,但是名字过多,用到较少时比较浪费资源
          return render(request, 'html页面',locals())
复制代码

模板层语法传值特性

复制代码
# 1.基本数据类型正常展示
      八大基本数据类型
# 2.文件对象也可以展示并调用方法
      视图层views: 
           file_obj = open(r'文件路径', 'rb')
      前端模板语法:
           <p>{{ file_obj }}</p>        # 展示文件信息
           <p>{{ file_obj.read }}</p>   # 读取文件内容
# 3.函数名会自动加括号执行并将返回值展示到页面上(不可以额外传参)
      视图层views:
           def func():
               print('一二三四五六七')
               return '谁写代码谁sb'
      前端模板语法:
           <p>{{ func1 }}</p>
# 4.类名也是自动加括号调用,对象不会自动加括号调用
      视图层views:
           class MyClass(object):
               def get_obj(self):
                   return '绑定给对象的方法'
               @classmethod
               def get_cls(cls):
                   return '绑定给类的方法'
               @staticmethod
               def get_static():
                   return '静态方法'
               obj = MyClass()
      前端模板语法:
           <p>{{ MyClass }}</p>
           <p>{{ obj }}</p>
           <p>{{ obj.get_obj }}</p>
           <p>{{ obj.get_cls }}</p>
           <p>{{ obj.get_static }}</p>

ps:针对可以加括号的名字模板语法都会自动加括号调用
复制代码

模板语法之过滤器

复制代码
<p>{{ i|add:10 }}</p>                             # 两个都是整型就是就是数字加起来
<p>{{ s|add:'baby' }}</p>                         # 两个都是字符串就是拼接
<p>{{ l|length }}</p>                             # 显示出l的字符长度
<p>{{ s|slice:'1:4' }}</p>                        # 对s的字符进行切片1~4
<p>{{ s|truncatechars:5 }}</p>                    # 按照字符展示相应位数 ...计算在内
<p>{{ s|truncatewords:3 }}</p>                    # 按照空格展示相应的单词数
<p>{{ ctime|date:'Y年-m月-d日 H时:i分:s秒 ' }}</p>  # 展示格式化时间,注意分钟的代表
<p>{{ file_size|filesizeformat }}</p>             # 换算对象的大小(kb,mb...)
<p>{{ h1|safe }}</p>                              # safe会开启前端的识别,识别后h1 = '<h1>哈哈哈哈</h1>'就会变为标题 哈哈哈哈
<p>{{ s1|safe }}</p>
复制代码

 模板层之标签

复制代码
# 1.模板语法标签
    -1. if相关:
        {% if 条件1(可以自己写也可以用传递过来的数据) %}
              条件1成立执行的代码
        {% elif 条件2(可以自己写也可以用传递过来的数据) %}
              条件2成立执行的代码
        {% else %}
              条件都不成立执行的代码
        {% endif %}
    -2. for相关:
        {% for i in s %}
              {% if forloop.first %}
                    <p>第一次for循环</p>
              {% elif forloop.last %}
                    <p>最后一次for循环</p>
              {% else %}
                    <p>中间的循环{{ i }}</p>
              {% endif %}
              {% empty %}
                    <p>传过来的数据是空的,不能for循环</p>
         {% endfor %}
# django模板语法取值只支持句点符,句点符既可以点索引也可以点键。
         例: {{ s1.hobby.1.music}}

# 复杂数据的获取可以起别名
         {% with s1.hobby.1.music as a1 %}
                 <a href="">{{ a1 }}</a>
         {% endwith %}
复制代码

自定义过滤器

复制代码
# 1.如果想要自定义标签函数,需要先准备一些事情
      -1.在应用下创建一个文件夹名字为templatetags
      -2.在temolatetags文件夹创建任意名字的py文件
      -3.在py文件中内部编写自定义相关代码
      -4.在py文件内导入固定代码
           form django.template import library
           register = Library()
                              &
           from django import template
           register = template.Library()

# 2.自定义过滤器(最大只能接收两个参数)
       @register.filter(name='myadd')
       def func1(a, b):
            return a+b
       {% load mytags %}
       <p>{{ i|myadd:1 }}</p>

# 3.自定义标签(参数没有限制)
       @register.simple_tag(name='mt')
       def func2(a, b, c, d):
            return a + b + c + d
       {% load mytags %}
       {% mt 'jason' 'kevin' 'oscar' 'tony' 'lili' %}

# 4.自定义inclusion_tag(局部的html代码)
        @register.inclusion_tag(filename='it.html')
        def index(n):
             html = []
             for i in range(n):
                  html.append('第%s页'%i)
             return locals()
             # 在HTML页面上调用一个inclusion_tag,其会作用于一个html页面(局部),将其插入原来调用的位置
        {% load mytags %} 
        {% index 10 %}          
复制代码

模板的继承于导入

复制代码
# 1.模板的继承
    """多个页面有许多相似的地方,所以需要用到继承(只适合前后端混合的项目)"""           
    空的HTML文件:
        {% extends 'html文件名' %}     # 全部继承
    -1.模板中使用block划定子板后可以修改的区域
    改一个页面需要在原模版上提前做好标记
        {% block 名字 %}               # 标记未来继承时要修改的
              模板内容
        {% endblock %}  
    -2.子模版继承
    继承的页面,先继承全部
        {% block 名字 %}               # 要修改的子模版代码(修改后)
              子模版内容
        {% endblock %}

    -3.一般模板上有三个区域可以使拓展性更高
        css样式:
             {% block css %}
             {% endblock %}
        html标签内容
             {% block content %}
             {% endblock %}
        js代码
             {% block js %}
             {% endblock %}
    -4.子板中还可以使用母板的内容 
        {{ block.super }}

# 2.模板的导入
    -1.把html页面某个部分当作模块的形式导入使用
        {% include 'menu.html' %}
    
            
复制代码

 

posted @   橘子菌菌n  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示