模板语法传值
列表:l=['a','b','c']
集合:se{‘a’,'yy','ss'}
元组:t=(111,222,333)
render(request.'index,html',locals())
语法规律
{{}}:变量相关
{%%}:逻辑相关
{{func}}
会自动加括号执行,但不支持带参数;
带参数会不执行
{{my_class}}
会自动加括号执行(实例化)
总结:内部会判断当前变量名是否可以加括号调用,如果可以就执行。针对函数名和类名
模板语法取值
d.hobby.3.info
1. 只能使用句点取值“.”, 可以混合使用。
2.“3”是索引,第三个的。
过滤器(最多两个参数)
过滤器的语法: {{ value|filter_name:参数 }}
default
如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值。
{{ value|default:"nothing"}}
如果value没有传值或者值为空的话就显示nothing
length
返回值的长度,作用于字符串和列表。
{{ value|length }}
返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.
filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)。例如:
{{ value|filesizeformat }}
如果 value 是 123456789,输出将会是 117.7 MB。
slice
切片
{{value|slice:"2:-1"}}
date
格式化
{{ value|date:"Y-m-d H:i:s"}}
safe
比如:
value = "<a href='#'>点我</a>"
{{ value|safe}}
truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
{{ value|truncatechars:9}}
truncatewords
在一定数量的字后截断字符串。
{{ value|truncatewords:9}}
cut
移除value中所有的与给出的变量相同的字符串
{{ value|cut:' ' }}
如果value为'i love you',那么将输出'iloveyou'.
join
使用字符串连接列表,例如Python的str.join(list)
标签
就是逻辑
for
#for
{% for user in user_list %}<li>{{ user.name }}</li>
{% endfor %}
for循环可用的一些参数:
Variable | Description |
---|---|
forloop.counter | 当前循环的索引值(从1开始) |
forloop.counter0 | 当前循环的索引值(从0开始) |
forloop.revcounter | 当前循环的倒序索引值(从1开始) |
forloop.revcounter0 | 当前循环的倒序索引值(从0开始) |
forloop.first | 当前循环是不是第一次循环(布尔值) |
forloop.last | 当前循环是不是最后一次循环(布尔值) |
forloop.parentloop | 本层循环的外层循环 |
for ... empty
对象是空,无法循环
{% for user in user_list %}<li>{{ user.name }}</li>
{% empty %}<li>空空如也</li>
{% endfor %}
if判断
if,elif和
else
{% if user_list|length > 5 %}七座豪华SUV
{% else %}黄包车
{% endif %}
{% if user_list %}用户人数:{{ user_list|length }}
{% elif black_list %}黑名单数:{{ black_list|length }}
{% else %}没有用户
{% endif %}
with
定义一个中间变量,多用于给一个复杂的变量起别名。
注意等号左右不要加空格。
#方法一
{% with business.employees.count as total %}{{ total }} employee{{ total|pluralize }}
{% endwith %}#方法二
{% with total=business.employees.count %}{{ total }} employee{{ total|pluralize }}
{% endwith %}
自定义过滤器、标签
先三步走
1. 在应用下创建一个名字 “必须” 教templatetags文件夹
2. 在该文件夹内创建 “任意” 名称的py文件 eg : mytag.py
3. 在该py文件内 “必须” 先书写下面两句话
from django import template
register = template.Library()
例子:
py文件:
from django import template
register = template.Library()#自定义过滤器,参数最多2个
@register.filter(name="cut")
def cut(value, arg):return value.replace(arg, "")@register.filter(name="addSB")
def add_sb(value):return "{} SB".format(value)#自定义标签,可以多个参数@register.simple_tag(name="plus")
def index(a,b,c,d):return '%s-%s-%s-%s'%{a,b,c,d}
html文件:
#自定义过滤器
{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}{# 使用我们自定义的filter #}
{{ somevariable|cut:"0" }}
{{ d.name|addSB }}#自定义标签,多个参数之间,用空格隔开
{% plus 'jason' 123 123 123 %}
inclusion_tag
"""
步骤1.在应用下创建一个名字必须为templatetags文件夹2.在该文件夹内,创建一个任意名称的py文件3.在py文件内固定写两行代码from django import templateregister = template.Library()"""
当HTML页面某一个地方的页面需要传参数才能动态的渲染出来,
并且在多个页面都需要使用该局部,那么就考虑将该局部页面做成inclusion_tag形式。
templatetags/my_inclusion.py
from django import templateregister = template.Library()@register.inclusion_tag('result.html')
def show_results(n):n = 1 if n < 1 else int(n)data = ["第{}项".format(i) for i in range(1, n+1)]return {"data": data}#第二种return locals()
templates/snippets/result.html
<ul>{% for choice in data %}<li>{{ choice }}</li>{% endfor %}
</ul>
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>inclusion_tag test</title>
</head>
<body>{% load inclusion_tag_test %}{% show_results 10 %}
</body>
</html>
模版的继承
note:所有模版,在后台渲染后,返回前端。
在子页面中
{% extends 'layouts.html' %}
块(block)
通过在母板中使用{% block xxx %}
来定义"块"。
在子页面中通过定义母板中的block名来对应替换母板中相应的内容。
{% block page-main %}<p>世情薄</p><p>人情恶</p><p>雨送黄昏花易落</p>
{% endblock %}
模板
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title>{% block page-css %}{% endblock %}
</head>
<body><h1>这是母板的标题</h1>{% block page-main %}{% endblock %}
<h1>母板底部内容</h1>
{% block page-js %}{% endblock %}
</body>
</html>
规律:一般模板内至少应该有三块区域
css
html
js
补充:
使用模板的内容
{{block.supper}}
模板导入
页面某个局部全部导入
{% include 'navbar.html' %}
引用:Django模板语言相关内容 - Q1mi - 博客园