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 模板层的主要内容,如果未能解决你的问题,请参考以下文章