Django 模板渲染
程序员文章站
2022-06-05 18:18:30
模板语言 {{ 变量 }} {% 逻辑 %} {{ 变量 }} {{ 变量 }}中的点号 用于取出字典/列表等类型数据的值 {{ list.2 }} 获取列表list中索引为2的值 {{ dict.name }} 获取字典中name的值 {{ 变量 }}内置的过滤器 以|分隔 {{ a|safe } ......
模板语言
{{ 变量 }}
{% 逻辑 %}
{{ 变量 }}
{{ 变量 }}中的点号
用于取出字典/列表等类型数据的值
{{ list.2 }} 获取列表list中索引为2的值
{{ dict.name }} 获取字典中name的值
{{ 变量 }}内置的过滤器
以|分隔
{{ a|safe }} 于django输出前,要求不对字符进行转义。自动转义关闭时自动失效
{{ time|date:'y-m-d h:i:s' }} 格式化输出时间 年月日时分秒
{{ list|join:',' }} 相当于 ‘,’.join(list)
{{ str|truncatechars:8 }} 显示内容为5个字符与3个点号 共8个字符
{{ str|truncatechars:8 }} 同上 显示单位为单词 按空格辨别
{{ str|length }} str的长度
{{ list|slice:'0-2' }} 切片索引0-2不含2
{{ var|default:'xxx' }} 为var设置默认值为‘xxx’
{{ str|lower }}{{ str|upper }} 输出显示为小/大写
{{ int|filesizeformat }} 转为内存大小单位 类似于2gb 1tb
{% 逻辑 %}
for循环
<ul> {% for student_name in name %} <li>{{ student_name }}</li>
{% empty %} //若name为空则于此结束并打印none
<li>none</li>
{% endfor %} //正常结束for循环
</ul>
if 条件判断语句
{% if num > 100 %} //比较运算符两边必须留下空格才可以识别 <p>大于100</p> {% elif num == 200 %} <p>等于100</p> {% else %} <p>小于100</p> {% endif %}
csrf_token
防御跨站请求伪造,这个标签用于跨站请求伪造保护
<form action='/main_h/' method="post"> {% csrf_token %} //写在form表单内 <input type="text" name="usm"> <input type="password" name="pwd"> <input type="submit"> </form>
装饰器的形式实现防御跨站请求伪造
from django.views.decorators.csrf import csrf_exempt,csrf_protect
# 于views.py文件中导入csrf_exempt,csrf_protect
@csrf_protect # 强制放行csrf认证,即便全局配置了csrf认
def main_h(request):
return render(request,'main_h.html')
@csrf_exempt # 强制进行csrf认证,即便全局没有配置csrf认证
def dome(request):
return render(request,'dome.html')
模板继承
1 创建一个模板.html文件, 2 {% extends '模板.html' %} 3 模板.html {% block content %} xxxxxxx{% endblock %} 还可以指定名字{% endblock content%} 4 继承模板的文件里面 {% block content %} 自己html里面的内容{% endblock %} 5 保留模板内容的写法 {% block content %} {{ block.super }}自己html里面的内容{% endblock %}
模板
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> <style> div{ float: left; width: 20%; } </style> </head> <body> <h1>welcome</h1> {% block head %} <h1 style="background: antiquewhite">这是模板的大概率应用部分</h1> {% endblock %}
# 设置可修改内容
<div> <p>标题一</p> <p>标题二</p> <p>标题三</p> </div>
{% block name %} <span>主页</span> {% endblock %}
# 设置可修改内容 </body> </html>
继承
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> </head> <body> {% extends "main_h.html" %}
# 继承模板html文件
{% block head %} {{ block.super }} {% endblock %}
# 继承延用内容
{% block name %} 分页1 {% endblock %}
# 继承修改内容 </body> </html>
组件
将一个完整功能模块,放到一个hmtl文件中,使用这个模块的其他页面,直接在页面中引入即可, 引入方式{% include '模块.html' %} ,任意位置引入
ps:(仅引入body内容)
组件html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> <style> h1{ width: 100%; height: 5%; background: aqua; } </style> </head> <body> <h1>这是组件内容</h1> </body> </html>
引入组件 {% include 'xxx.html' %}
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> </head> <body> {% include 'h1_h.html' %} //引入组件 ps:(与模板冲突,只会显示模板而不显示组件) </body> </html>
自定义标签与过滤器
1 app应用文件夹中创建一个叫做templatetags的文件夹 2 创建一个py文件,例如:mytag.py 3 mytag.py, from django import template register = template.library() #register变量必须是这个名字 过滤器: @register.filter def xxx(): 参数最多两个 return 'xxx' 标签: @register.simple_tag def sss(): 参数可以多个 return 'xxx' 标签: @register.inclusion_tag('html文件') def aaa(): 参数可以多个 return {'xx':'xxxxx'} html文件中的使用 <h1> {# {{ num|xxx:'11,23,33'}}#} {{ num|xxx:20 }} {% if num|xxx:20 > 2000 %} <h2>大于2千</h2> {% else %} <h2>小于等于2千</h2> {% endif %} </h1> <h1> {% sss num 10 15 %} </h1> <h1> {% aaa %} </h1>
pydiango1\app01\templatetags\mytag.py文件下
from django import template from django.utils.safestring import mark_safe register=template.library() @register.simple_tag def sum_max(a,b,c,d): num=a*b*c*d return num # 自定义标签 可接收多个参数 @register.filter def num_20(num1,num2): num1*=num2 return num1 # 自定义过滤器 最多接收2个参数
html文件下
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>title</title> </head> <body> {% load mytag %} //引入mytag.py文件 {% include 'h1_h.html' %} {% sum_max 7 8 9 10 %} <p>{{ num|num_20:2 }}</p> </body> </html>