Python django-05 模板层

Posted tfzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python django-05 模板层相关的知识,希望对你有一定的参考价值。

一 模板语法

在前段页面中书写
模板语法两大类
1. {{}}  变量相关
2.{%%}  逻辑相关

二 后端向前端html文件传值的两种方式

# 第一种字典{k:v}的形式,html文件中接收的变量名要与字典的k一样
n=1
return render(request,index.html,{n:n})

# 第二种locals()形式,会将视图函数名称空间的所有名字传过去浪费资源,html文件中接收的变量名要与视图函数中的变量名一致
return render(request,index.html,locals())  

三 模板传值的数据类型格式

支持传输的数据类型:

后端:
  整型 
  浮点型 
  字符串  # 前端不支持点索引取值,但python中支持
  
  列表     # html文件中可以列表点索引取值 
  {{ ls.0 }}
  
  字典  # html文件中可以字典点k取值,k不加引号
  {{ d.name }}
  
   元组 #  html文件中可以元组点索引取值
   {{ ls.0 }}
  集合
  函数名   # 前端页面会加括号自动调用展示返回值,但不支持传参函数
  对象      # 会打印该对象,html文件中可以对象点属性方法(不带参数的) 
django模板语法在取值的时候 统一使用句点符(大白话就是 点号   .)#} 

四 前后端取消转义

第一种方式后端操作
# 后端:mark_safe(标签和内容)
例:
from django.utils.safestring import mark_safe
zzz = mark_safe(<h1>阿萨德搜啊第三款垃圾袋</h1>)
return render(request,reg.html,locals())

第二种方式
# 前端:|safe
{#<p>{{ zzz|safe }}</p>#}

五 模板语法过滤(有点类似于python中数据类型的内置函数)

1.在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

   过滤器的语法: {{ value|filter_name:参数 }}

2.注意:

1.过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
2.过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
3.过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:,  }}
4.|左右没有空格没有空格没有空格

3.常用过滤器(Django的模板语言中提供了大约六十个内置过滤器。)

技术图片
1.length:作用于统计字符串和列表的长度,当不能统计长度时值为0。
<p>前端统计字符串的长度:{{ s|length }}</p>

2.default:一个变量不存在或值是false,使用给定的默认值否则使用变量的值。
<p>前端获取数据如果是空就返回default后面默认的参数值:{{ flag|default:你这个东西是个空}}</p>

3.filesizeformat:
<p>将数字格式化成表示文件大小的单位:{{ file_size|filesizeformat }}</p>

4.truncatewords:按照一定空格数量截断字符串。
<p>按照空格截取文本内容:{{ res|truncatewords:4 }}</p>

5.truncatechars:按照一定字符数量截断字符串。
取固定的长度的字符串 三个点也算:{{ s|truncatechars:10 }}</p>

6.date:日期格式化
#后端
from datetime import datetime
ctime = datetime.now()
#前端
# {{ value|date:"Y-m-d H:i:s"}}  # 年月日时分秒
<p>格式化时间(不要加百分号){{ ctime|date:Y-m-d }}</p> # 年月日

7.add:字符串拼接 整型相加
<p>{{ hahah|add:heheheh }}</p>

8.slice:字符串或列表切片
<p>{{ l|slice:0:3 }}</p>
<p>{{ l|slice:0:5:2 }}</p>

9.cut:移除value中所有的与给出的变量相同的字符串
{{ value|cut:  }} # 如果value为‘i love you‘,那么将输出‘iloveyou

10.join:使用字符串连接列表,例如Python的str.join(list)

11.safe:取消转义
value = "<a href=‘#‘>点我</a>"
{{ value|safe}}
常用过滤器

4.自定义过滤器

#1.必做的三件事

1.在应用名下新建一个名为templatetags文件夹(必须叫这个名字)
2.在该新建的文件夹内新建一个任意名称的py文件
3.在该py文件中需要固定写下面两句代码
  from django import template
  register = template.Library()

#2.如何使用

# 后端templatetage文件夹下的mytag.py文件
  from django import template
  register = template.Library()

  # 自定义过滤器
  @register.filter(name=baby) # name后可以自定义名字
  def index(a,b):
      print(下午刚起床 一脸懵逼)
      return a + b

#前端HTML文件中
  {% load mytag %} # 加载
  {{ 123|baby:1}}  # 前端页面显示124(自定义过滤器 只能由两个形参,)

    

#自定义标签

1.做和自定义过滤器相同的三步骤:
2.后端
from django import template
  register = template.Library()
# 自定义标签 # 支持传多个值 @register.simple_tag(name=jason) # name值可以为其他的 def xxx(a,b,c,year): return %s?%s|%s{%s%(a,b,c,year) 3.前端 {% load mytag %} # 加载 {% jason 1 2 3 year=2 %} # 支持传多个参数 参数与参数之间 空格隔开即可

# 自定义inclusion_tag

工作原理:

技术图片

 

 

1.
# 后端
  from django import template
  register = template.Library()
# 自定义inclusion_tag
  @register.inclusion_tag(bigplus.html) # 参数为html2文件
   def bigplus(n): # 函数参数
      ls = []
      for i in range(n):
          ls.append(第%s项%i)
      return {ls:ls}

#html1文件
{% load mytag %}
{% bigplus 5 %}

#htm2文件
<ul>
    {% for foo in ls %}
        <li>{{ foo }}</li>
    {% endfor %}
</ul>

六  模板语法标签

{%%}

1.for循环

1.常用语法:
            {% for foo in l %}
                <p>{{ foo }}</p>
                <p>{{ forloop }}</p>
            {% endfor %}
2.empty:当你的for循环对象为空的时候会自动走empty代码块儿的内容
{% for foo in l %}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次了啊</p>
{% else %}
<p>嗨起来!!!</p>
{% endif %}
{% empty %}
<p>你给我的容器类型是个空啊,没法for循环</p>
{% endfor %}

forloop

技术图片

 

 

 技术图片

2.if 判断

            {% if flag %}
                <p>flag不为空</p>
                {% else %}
                <p>flag是空</p>
            {% endif %}
# if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

3.for循环和if判断嵌套

            {% for foo in l %}
                {% if forloop.first %}
                    <p>这是我的第一次</p>
                {% elif forloop.last %}
                    <p>这是最后一次了啊</p>
                {% else %}
                    <p>嗨起来!!!</p>
                {% endif %}
            {% endfor %}

4.with(相当于python中定义的变量):定义一个中间变量,多用于给一个复杂的变量起别名。注意等号左右不要加空格。

1.第一种方式
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
2.第二种方式
{% with business.employees.count as total %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

七 模板的继承

1.当多个页面整体的样式都大差不差的情况下 可以设置一个模板文件,在该模板文件中 使用block块划分多个预期,之后子版在使用模板的时候 可以通过block块的名字 来选定到底需要修改哪一部分区域

2.

                模板一般情况下 应该至少有三个可以被修改的区域
                {% block css %}
                    子页面自己的css代码
                {% endblock %}
                
                
                {% block content %}
                    子页面自己的html代码
                {% endblock %}
                
                
                {% block js %}
                    子页面自己的js代码
                {% endblock %}

3.使用

# 母模板

 #####其他html代码 子模板继承不可修改      

       <div class="col-md-10">

            {#这是模板语法的注释 不会展示到前端#}
{#          在你想把某一个页面作为模板的时候  可以在该页面上使用block划分区域 并且给该区域命名#}
{#        之后你在使用该模板的时候  就可以通过名字 来指定需要修改哪一个区域的内容#}
            {% block content %} # 划分区域命名,子模板继承后可修改此区域
                <div class="jumbotron">
                  <h1>Hello, world!</h1>
                  <p>...</p>
                  <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
                </div>
            {% endblock %}

        </div>

# 子模板

###不需要其他代码

{% extends ‘home.html‘ %} # 参数为母模板文件名
{{ block.super }} # 显示划分区域的html代码,
{% block css %} # 对母模板换分区域修改 <style> h1 { color: red; } </style> {% endblock %}

八 模板的导入

1.当你写了一个特别好看的form表单/列表标签等,可以将它当成一个模块 哪个地方需要 就直接导入使用即可

模板html文件

##无其他代码
<h1>我是一个特别特别的好看的form表单</h1>

要导入的html文件

# 在使用的地方导入
{% include ‘beautiful.html‘ %} # 参数为模板文件名

以上是关于Python django-05 模板层的主要内容,如果未能解决你的问题,请参考以下文章

Django之模板层

微信小程序开发--模板(template)使用,数据加载,点击交互

Django 模板层(Template)

VSCode自定义代码片段——.vue文件的模板

Django的MTV的模式三大层之一,模板基础

62.Django05——视图层