模版层
变量
- {{ }}:变相相关的
- {%%}逻辑相关
def template_test(request):
l = [11, 22, 33]
d = {"name": "alex"}
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def dream(self):
return "{} is dream...".format(self.name)
Alex = Person(name="Alex", age=34)
Egon = Person(name="Egon", age=9000)c
Eva_J = Person(name="Eva_J", age=18)
person_list = [Alex, Egon, Eva_J]
return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})
{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}
过滤器
语法 | 描述 |
---|---|
{{ 变量|length }} | 统计长度 |
{{ 变量|default:'啥也不是'}} | 默认值(布尔值是True就展示第一个参数的值否在展示冒号后面的值) |
{{ 变量|filesizeformat: }} | 文件大小 |
{{ 变量|slice:'0:4:2'}} | 切片操作 |
{{ 变量|truncatechars:9 }} | 切取单词(不包含三个点 按照空格切),切取字符(包含三个点) |
{{ 变量|cut:' ' }} | 移除特定的字符 |
{{ 变量|join:'$' }} | 拼接操作 |
{{ 变量|add:10 }} | 拼接操作 |
{{ 变量|safe }} | 转义 |
{{ 变量|res }} | 转义 |
{{ 变量|'Y-m-d H:i:s' }} | 日期格式化 |
{{ 变量| }} | |
{{ 变量| }} | |
{{ 变量| }} |
标签
for循环:
{% for foo in l %}
<p>{{ forloop }}</p>
<p>{{ foo }}</p> 一个个元素
{% endfor %}
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 6, 'revcounter0': 5, 'first': True, 'last': False}
if判断:
{% if b %}
<p>baby</p>
{% elif s%}
<p>都来把</p>
{% else %}
<p>老baby</p>
{% endif %}
for 和 if混合使用
{% for foo in lll %}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次啊</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% empty %}
<p>for循环的可迭代对象内部没有元素 根本没法循环</p>
{% endfor %}
处理字典的其他方法
{% for foo in d.keys %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.values %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.items %}
<p>{{ foo }}</p>
{% endfor %}
with起别名
{% with d.hobby.3.info as nb %}
<p>{{ nb }}</p>
在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式
<p>{{ d.hobby.3.info }}</p>
{% endwith %}
自定义过滤器、标签、inclusion_tag
自定义过滤器
# 自定义过滤器
@register.filter(name='baby')
def my_sum(v1, v2):
return v1 + v2
# 使用
{% load mytag %}
<p>{{ n|baby:666 }}</p>
自定义标签
# 自定义标签(参数可以有多个) 类似于自定义函数
@register.simple_tag(name='plus')
def index(a,b,c,d):
return '%s-%s-%s-%s'%(a,b,c,d)
# 使用
标签多个参数彼此之间空格隔开
<p>{% plus 'jason' 123 123 123 %}</p>
自定义inclusion_tag
# 自定义inclusion_tag
"""
内部原理
先定义一个方法
在页面上调用该方法 并且可以传值
该方法会生成一些数据然后传递给一个html页面
之后将渲染好的结果放到调用的位置
"""
@register.inclusion_tag('left_menu.html')
def left(n):
data = ['第{}项'.format(i) for i in range(n)]
# 第一种
# return {'data':data} # 将data传递给left_menu.html
# 第二种
return locals() # 将data传递给left_menu.html
{% left 5 %}
# 总结:当html页面某一个地方的页面需要传参数才能够动态的渲染出来,并且在多个页面上都需要使用到该局部 那么就考虑将该局部页面做成inclusion_tag形式
模板的继承
母版
..............
..............
..............
{% block css%}
{%endblock%}
..............
..............
{% block content %}
{% endblock %}
...............
...............
{% block js %}
{% endblock %}
子模板
{% extends 'home.html' %} # 继承模板
{% block css%}
写入自己的内容
{%endblock%}
{% block content %}
写入自己的内容
{% endblock %}
{% block js %}
写入自己的内容
{% endblock %}
每一个子页面就都可以有自己独有的css代码 html代码 js代码