Django模板层
目录模板语法传值
# 模板语法形式:1.{{ 变量相关 }} 2.{% 逻辑相关 %}
# 模板语法可以传递的后端数据类型
# 包括基本数据类型、函数(自动加括号执行,并传递返回值,不支持传参)、类(自动实例化)、对象(可以调用对象自动传参或者无参方法 eg:__str__(self))
# 原则,先判断接收的变量名是否可以添加'()'调用,能调用就调用。
# django模板语法的取值,只能使用'.'取值,固定格式
'''
<p>{{ dict1.key1 }}</p>
<p>{{ list1.index1 }}</p>
<p>{{ dict1.key1.index1.keyx }}</p>
'''
# 可以'.'键'.'索引或者混用
过滤器
# 即模板语法内置方法
# 基本语法:{{ 数据|过滤器:参数 }}
s = 'abc'
<p>{{ s|lenth }}</p> # 统计长度,即 <p>3</p>
<p>{{ n|default:'空' }}</p> # 默认值,当n为True,就传递n的值,否则传递default值
<p>{{ file_size|filesizeformat }}</p> # 传递格式化后的文件大小
<p>{{ current_time|date:'Y-m-d H:i:s' }}</p> # 传递格式化后的时间
<p>{{ l|slice:'0:4:2' }}</p> # 传递切片
<p>{{ info|truncatechars:9 }}</p> # 传递截取后的字符,效果:123456...
<p>{{ info|truncatewords:3 }}</p> # word1 word2 word3...(长度不含...,而且切取依据是空格)
<p>{{ info|cut:' ' }}</p> # 传递移除' '之后的字符
<p>{{ list1|join:'$' }}</p> # 传递用'$'连接各元素后的字符串
<p>{{ n|add:2 }}</p> # 传递n+1
<p>{{ s|add:info }}</p> # 传递s+info
<p>{{ h1|safe }}</p> # 取消转义
# 后端取消转义
html_code = '<h1>ahhahahahah</h1>'
h2 = mark_safe(html_code)
标签
# for循环
'''
{% for li in list1 %}
{{ forloop }}
{% endfor %}
'''
'''
{% for li in list1 %}
<p>{{ li }}</p>
{% endfor %}
'''
# if判断
'''
{% if bllo1 %}
<p>hahahah</p>
{% elif %}
<p>wahahahahahha</p>
{% else %}
<p>xixiixixxiix</p>
{% endif %}
'''
# for + if
'''
{% for li in list %}
{% if forloop.first %}
<p>第一次循环</p>
{% elif forloop.last %}
<p>最后一次循环</p>
{% else %}
<p>{{ li }}</p>
{% endif %}
{% empty %}
<p>for循环的对象是空</p>
{% endfor %}
'''
'''
{% for foo in dict1.keys/.values/.items %}
{{ forloop }}
{% endfor %}
'''
# with语法
'''
{% with dict1.key2.index1.keyx as s %}
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
<p>s</p>
{% endwith %}
'''
自定义过滤器、标签、inclusion_tag
'''
1.在应用下创建一个templatetags文件夹
2.在该文件夹内创建任意名称的py文件 eg: mytag.py
3.在该py文件内:
from django import template
register = template.Library()
'''
# 自定义过滤器(最多两个参数)
@register.filter(name='sum_filter')
def my_sum(a1,a2):
return a1 + a2
# 自定义过滤器调用
{% load mytag %}
<p>{{ a1|sum_filter:a2 }}</p>
# 自定义标签(可以有多个参数)
@register.simple_tag(name='my_tag')
def index(a, b, c, d):
return f'{a}/{b}/{c}/{d}'
# 自定义标签的调用
{% load mytag %}
<p>{% my_tag 'a' 'b' 'c' 'd' %}</p>
# 自定义inclusion_tag
@register.inclusion_tag('left_menu.html')
def left(n):
data = [f'第{i}项' for i in range(n)]
return locals() #将data传递给left_menu.html 即 return {'data':data}
# 定义渲染工具页面 left_menu.html
'''
<ul>
{% for datum in data %}
<li>{{ datum }}</li>
{% endfor %}
</ul>
'''
# 自定义inclusion_tag调用
{% load mytag %}
{% left 9 %}
模板的继承
# 模板页面设置
'''
<div class="panel-body">
{% block var_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 var_content %}
<h1>注册页面</h1>
{% endblock %}
'''
# 一般情况下,模板页面应该至少有三块可以被修改的区域
'''
1.css区域
{% block css %}
{% endblock %}
2.html区域
{% block content %}
{% endblock %}
3.js区域
{% block js %}
{% endblock %}
'''
模板的导入
# 即将模板页面模块化,然后实例页面直接使用语法将模板页面所有代码直接导入
{% include 'part.html' %}
标签:语法,自定义,html,Django,传递,tag,模板
From: https://www.cnblogs.com/missfxy/p/16930670.html