django 模板层
目录
django模板层
模板语法之传值操作
模板语法
{{}} # 主要与数据值相关
{%%} # 主要与逻辑相关
注意:
django的模板语法是自己写的,与jinja2模块不一样。
模板语法的注释前端浏览器是无法查看的 {##}
传值操作
方法1:
return render(request, 'demo02.html', {'n1': name, 'a1': age})
这种传值方式很精准,但是数据如果过多的话书写麻烦
方法2:
return render(request,'demo02.html', locals())
将当前函数内的所有名字都传给页面,如果函数内部含有大量的逻辑代码名字过多 不使用的情况下比较浪费资源
模板语法的传值特性
- 基本数据类型都可以正常展示
- 文件对象也可以展示并调用文件的一些功能
- 函数名会自动加括号调用并将返回值展示到页面上(不支持额外传参)
- 类名也会自动括号调用
- 对象则不会加括号调用可以点他的方法
"针对可以加括号调用的名字模板语法都会自动加括号调用"
过滤器(内置函数)
{{i|add:1}} # 给数字+1
{{s|add:' nb'}} # 给字符拼接
{{l|length }} # 统计字符串或列表的长度
{{s|slice:'1:4'}} # 切割操作
{{s|truncatechars:3}} # 3个字符后... 三个点算一个字符 用在简介内
{{s|truncatewords:3}} # 按照空格来截取 第三个空格
{{time|date:'Y-m-d H:i:s'}} # 把视图层传过来的时间(结构化) 转成格式化
{{file_size|filesizeformat }} # 单位换算
传标签默认是不识别的,需要修改safe参数 告诉他是安全的
{{ h1|safe }}
更多过滤器参考博客:
https://www.cnblogs.com/Dominic-Ji/articles/10982302.html
模板层之标签
if..elif..else
模板层也有if判断与python大体上相似
{% if 条件 %}
<p>if 条件成立展示</p>
{% elif 条件1 %}
<p>elif 条件成立展示</p>
{% else %}
<p> 上述条件不成立展示</p>
{% endif %}
不同的是在模板层使用if判断需要用模板语法{% %} 来写,并且要用 endif 结尾。条件可以自己编写也可以从视图层传。
for循环
{%for i in 数据集 %}
<p>{{ i }}</p>
{% endfor %}
它有一个自带的对象 forloop 里面有些数据 请看下图
利用forloop编写if判断
{% for foo in li %}
{% if forloop.first %} # 判断第一次循环
<p>勇士,欢迎进入大草原副本(拒绝绿),您有3次机会</p>
{% elif forloop.last %} # 判断最后一次循环
<p>勇士,您的机会用完了,您绿了</p>
{% else %} # 不是第一次和最后一次那就是中间的
<p>这一次你也失败了</p>
{% endif %}
{% empty %} # 如果传的数据是空的就会展示下p
<p> 传的数据是空的 无法循环取值</p>
{% endfor %}
模板层取值
d1={'name':'liaji','age':18,'hobby':['read','music',{'a1':'哥布林森林','a2':'瘟疫之源'}]}
如上所示:
我们需要取到字典中hobby内列表里的字典a1的值
django模板层索引位也支持点的方式
<p>{{d1.hobby.2.a1}}</p>
哥布林森林
并且支持其别名 # 前提是必须在with里
<p>
{{ d1.hobby.2.a1}}
{% with d1.hobby.2.a1 as g %}
<p style="color: hotpink">{{ g }}</p>
{% endwith %}
</p>
自定义过滤器
准备工作
自定义一些模板语法 需完成下列的三步操作
- 在应用目录下创建一个名字必须叫templatetags的目录.
- 在上述目录下创建任意名称的py文件
- 在上述py文件内先编写两行固定的代码
from django import template
register = template.Library()
开始操作
自定义过滤器
研究内置过滤器发现 他们都是一个函数并且用一个类似语法糖 装饰了
@register.filter(is_safe=False)
我们编写一个add功能
@register.filter(name='myadd')
def func1(a,b):
return a+b
在前端使用时需要提前导入py文件
{% load my %}
<p> {{ i|myadd:41 }}</p>
自定义标签
@register.simple_tag(name='mytag')
def func2(a,b,c,d,e):
return f'{a}{b}{c}{d}{e}'
{% load my %}
{% mytag 'h' 'e' 'l' 'l' 'o'%}
hello
自定义inclusion_tag
局部的html代码
与前两种方法不一样的是 他是先把函数的返回值传给一个页面后渲染后,然后再把页面放到调用inclusion_tag的位置。
1.需要我们提前创建好一个空的html内部清空。# menu.html
2.再去templatetags的目录下创建的py文件内编写函数
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n): # 传一个数值过来
html = []
for i in range(n): # 循环对应的数值此时
html.append('<li>第%s个</li>'%i)
# 把每次循环 li标签添加到空列表里
return locals()
menu.html文件内 # 先把函数的返回值传给一个页面后渲染后
<ul>
{% for liStr in html %} # 循环获取列表内的li标签
{{ liStr|safe }} # 展示 safe可以识别标签语法
{% endfor %}
</ul>
前端页面(调用inclusion_tag的位置):
{% load my %}
{% mymenu 10 %} # 穿一个数值回去
模板的继承
功能网页可以继承主站的一些样式,并可以通过 自定义一些板块与样式
方法1: 复制主站的代码
方法2: 模板的继承
- 在主站中使用block划定可以给子版修改的区域
{% block 区域名称 %} # 名称可以随便起
{% endblock %}
- 子板继承模板
需要清空子文件
{% extends '继承的html文件' %}
{% block 区域名称 %}
子板自己的内容
{% endblock %}
# 模板中至少应该有三个区域
页面内容区、css样式区、js代码区
子板也可以继续使用模板的内容
{{ block.super }} 在 {% block 区域名称 %} 下面填写
模板的导入
举个例子:
如果有很多html文件都可以用到表单文件,我们可以先写一个html文件在其内部 写好form表单渲染后, 可以在别的地方直接导入这个模板 就可以使用内部的表单。
{% include 'myform.html' %}