一、模板语法传值
如何给html文件传值
1.字典挨个指名道姓
return render(request,"home.html",{"data":data})
节省系统资源
2.locals()全部传递
return render(request,"home.html",locals())
节省人力资源 # 学习阶段就使用这种方式
1.python基本数据类型全部支持模板语法传值
2.在django中模板语法取值只能使用一种方式(句点符.)
3.针对函数名模板语法传值之后会自动加括号执行将返回值渲染到页面上
4.针对类名和对象名模板语法传值之后都会先加括号调用 # 重要
类名加括号会产生对象
对象加括号不符合正常的调用方式 还是对象本身
但是会触发产生该对象类中的__call__方法
"""
小总结
django模板语法不支持函数传参、类传参,
当需要引用变量名的时候使用双大括号 {{}}
"""
{{}} # 跟变量名相关
{%%} # 跟功能逻辑相关
二、模板语法之过滤器
# 相当于python的内置函数
{#<p>过滤器:(|) 将管道符左边的数据当做第一个参数传入过滤器中如果需要第二个参数 则名称后冒号</p>#}
<p>统计长度:{{ l|length }}</p>
<p>加法运算:{{ i|add:123 }}</p>
<p>默认值:{{ b|default:'布尔值为False' }}</p>
<p>时间格式:{{ ctime|date:'Y-m-d H:i:s' }}</p>
<p>截取字符(包含三个点):{{ ss|truncatechars:10 }}</p>
<p>截取单词(不包含三个点):{{ ss|truncatewords:3 }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>转义:{{ s1|safe }}</p>
后端也可以转义
from django.utils.safestring import mark_safe
s2 = "<script>alert(123)</script>"
res = mark_safe(s2)
或
res=mark_safe('<h1>123</h1>')
三、模板语法之标签
<p>标签:其实就是流程控制 if判断 for循环</p>
{% for foo in s %}
{% if forloop.first %} # 有firs、last、counter0、counter
<p>这是第一次循环</p>
{% elif forloop.last %}
<p>这是最后一次</p>
{% else %}
<p>继续!!!</p>
{% endif %} # for循环对象没有值的情况下
{% empty %}
<p>传递过来的数据是空的</p>
{% endfor %}
四、自定义过滤器、标签、inclusion_tag
介绍
# 本节做一个大致了解即可(使用频率不高)
过滤器相当于python中的内置函数
自定义过滤器相当于自定义函数,自定义标签也是
"""
四步走战略
# 自定义过滤器 标签 inclusion_tag都需要三步走
1.在app应用文件夹下创建一个名字必须叫templatetags文件夹
2.在创建的文件夹下创建一个任意名称的py文件
3.在该py文件内先固定写两句话
from django import template
register = template.Library()
4.在前端html文件中导入 {% load [自定义名称.py文件] %}
"""
自定义过滤器(register.filter)
----------------------------------"后端配置"----------------------------------
格式:
# /app01/templatetags/my_tag.py
from django import template
register = template.Library()
@register.filter(name='自定义名字,web上使用')
def func(a, b):
return a + b
注意:
自定义过滤器最多只能传两个参数,多了报错
----------------------------------"前端使用"----------------------------------
格式:
{{ 变量|name名字:传的参数 }}
例:
{{ num|m }}
案例
--------------------------"/app01/templatetags/my_tag.py"------------------------
from django import template
register = template.Library()
# 自定义过滤器(无论是内置的还是自定义都只能最多两个参数)
@register.filter(name='my_add')
def my_add_func(a, b):
return a + b
---
urlpatterns = [
url(r"^index/",views.index)
]
----------------------------------"views.py"----------------------------------
def index(request):
num = 123
return render(request,"index.html",locals())
----------------------------------"index.html"----------------------------------
...
<body>
{% load mytag %}
{{ num|my_add:10}}
</body>
...
----------------------------------"运行django"----------------------------------
1、web输入"127.0.0.1:8000/index/"
2、运行views.py的index()函数,将num=123传入index.html页面
3、{{ num|my_add:10}},运行自定义过滤器,运算 123+10=133
4、页面上显示133
自定义标签(register.simple_tag)
----------------------------------"后端配置"----------------------------------
格式:
# /app01/templatetags/my_tag.py
from django import template
register = template.Library()
@register.simple_tag(name="my_tag")
def my_tag(a,b,c,d):
return "%s|%s|%s|%s" % (a,b,c,d)
----------------------------------"前端使用"----------------------------------
{% load mytag %}
{% my_tag 1 2 3 4 %}
案例
--------------------------"/app01/templatetags/my_tag.py"------------------------
from django import template
register = template.Library()
# 自定义过滤器(无论是内置的还是自定义都只能最多两个参数)
@register.simple_tag(name="my_tag")
def my_tag(a,b,c,d):
return "%s|%s|%s|%s" % (a,b,c,d)
---
urlpatterns = [
url(r"^index/",views.index)
]
----------------------------------"views.py"----------------------------------
def index(request):
num = 123
return render(request,"index.html",locals())
----------------------------------"index.html"----------------------------------
...
<body>
{% load mytag %}
{% my_tag 1 2 3 4 %}
</body>
...
----------------------------------"运行django"----------------------------------
访问127.0.0.1:8080/index/
显示:
1|2|3|4
自定义inclusion_tag
from django import templateregister = template.Library()@register.inclusion_tag("my_ul.html",name="my_inclusion_tag")def my_inclusion_tag(n): new_list = [] for i in range(1,n): new_list.append("我的第%s次"%i) return locals()---------------------"my_ul.html---------------------# 显示在index的局部页面,只需要一下内容即可,不需要head、body标签<ul> {% for foo in new_list %} <li> {{ foo }} </li> {% endfor %}</ul>---------------------index.html---------------------<body>{% load mytag %}{% my_inclusion_tag 5 %}</body>
五、模板的继承
在母版中先使用block划定将来可以修改的区域 {% block 自定义名称 %} 母版内容 {% endblock %} 在子版中继承并修改指定区域 {% extends 'home.html' %} {% block 自定义名称 %} 自定义其他内容 {{ block.super }} # 也可以引用母版的内容 {% endblock %} """母版中最少应该有三块区域 {% block content %} 可以根据页面内容的布局写多个 {% endblock %} {% block css %} {% endblock %} {% block js %} {% endblock %}"""
六、模板的导入
类似于导模块 该模板不应该是一个完整的页面 而是一个局部页面 很多地方都需要使用的情况下可以使用模板的导入格式:{% include 'menu.html' %}