1 公用模板可以放置在根目录的templates中
但是要注意修改templates的dirs,引导程序启动时优先去根目录中寻找模板
2 模板数据传递及渲染
2.1 数据传递
2.1.1 基本传递
def demo(request):
list = [11,22,33]
return render(request, 'demo.html', {'list':list})
<div>{{ list }}</div>
2.1.2 for循环
def demo(request):
list = [11,22,33]
return render(request, 'demo.html', {'list':list})
<div>
{% for i in list %}
<li>{{ i }}</li>
{% endfor %}
</div>
2.2 模板继承
模板只能继承1个
2.3 片段导入
include可以多次导入或导入多个
3 模板渲染的易错点
def demo(request):
return render(request, 'demo.html', {'info':'999'}) # info整形
return render(request, 'demo.html', {'info':'张三'}) # info字符串形式
return render(request, 'demo.html', {'info':[11,22,33]}) # info列表
<body>
<h1> {{ info }} </h1> # 所有内容都可以正常显示,因为读取内容后完成渲染,且<h1>标签中可以直接写字符串,不用加引号
<script src="www.abcd.js"></script> #如果js文件中有{{ info }}或是其他需要渲染的内容,无法显示,因为读取内容后,会直接传给前端,前端根据需要再访问地址,获取内容
<script>
alert({{ info }}); # 如果是数字可以正常显示,列表也可以正常显示(js读取为数组),但是字符串会报错,字符串必须加引号
alert('{{ info }}'); # info是字符串的处理方式
</script>
</body>
4 模板函数
4.1 在app目录下创建templatetags,只能这个名字
4.2 在该路径下创建任意py文件
4.2.1 simple_tag
from django.template.library import Library
register = Library() # 只能叫register
@register.simple_tag()
def my_func(v1, v2, v3):
return "哈哈哈哈" + v1 + v2 + v3
<body>
<div>{% my_func "张三" "李四" "王二" %}</div>
</body>
4.2.2 inclusion_tag
return render(request, 'demo.html', {'num':[11,22,33,44]})
@register.inclusion_tag("xo.html")
def my_xo(num):
return {"x1": [item for item in num if item > 22]}
xo.html
<ul>
{% for item in x1 %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<body>
<div>{% my_xo num %}</div>
</body>
4.2.3 filter
@register.filter
def my_tt(a1, a2):
return "哈哈哈" + a1 + a2
filter支持在模板中作为条件放在if后
<body>
<div>{{ "alex"|my_tt:"xxxx" }}</div>
{% if "alex"|my_tt:"xxxx" %}
<h1>真</h1>
{% else %}
<h1>家</h1>
{% endif %}
</body>