本文转载自https://blog.csdn.net/xiaogeldx/article/details/87840997
模板标签
- 模板标签:标签在渲染的过程中提供任意的逻辑
- 这个定义是刻意模糊的,例如:一个标签可以输出内容,作为控制结构,如if语句或for循环从数据库中提取内容,甚至可以访问其他的模板标签
准备
- 在http://www.bootcss.com/上找个模板,查看源代码,复制,粘贴到index.html
- F12查看,复制cover.css(模板.css)中的代码,粘贴到static/students/css/index.css中
- 将复制到index.html文件中的代码的body内容删除替换自己的代码


效果图:

标签语法
- 由{% 和 %}来定义的,例如:{% tag %}
常用标签
- 标签内的语法和Python语法大致一样

案例
-
index.html文件中的demo
{# 如果students为空,则渲染empty下的内容#}
{% for stu in students %}
<tr {% if stu.age < 17 %}style="color:blue;"
{% elif stu.age > 16 and stu.age < 22 %}style="color:red;"
{% else %}style="color:green;"
{% endif %}>
{# forloop.counter获取当前for循环的迭代次数,以1开始#}
{# 硬编码跳转 #}
{# forloop.counter0获取当前for循环的迭代次数,以0开始#}
{# #}
{# forloop.revcounter获取当前for循环的迭代次数,从大到小#}
{# #}
{# forloop.revcounter0获取当前for循环的迭代次数,从大到小,最小为0#}
{# #}
{# 如果students为空,则渲染empty下的内容#}
{# {% empty %}#}
{# 要渲染的内容#}
{% endfor %}序号 姓名 年龄 性别 {{ forloop.counter }} {{ forloop.counter }} {{ forloop.counter0 }} {{ forloop.revcounter }} {{ forloop.counter0 }} {{ stu.name }} {{ stu.age }} {{ stu.gender }} -
views.py文件中的demo:
def index(request):
students = [
{'id':10, 'name': '小哥', 'age': 15, 'gender': '男'},
{'id':33,'name': 'yang', 'age': 15, 'gender': '女'},
{'id':53,'name': 'wen', 'age': 25, 'gender': '女'},
{'id':12,'name': 'long', 'age': 18, 'gender': '男'},
{'id':76,'name': 'na', 'age': 16, 'gender': '女'},
{'id':38,'name': 'yi', 'age': 19, 'gender': '女'},
{'id':48,'name': 'xin', 'age': 17, 'gender': '男'},
]
return render(request, 'students/index.html', context={
'students': students,
})
def detail(request, pk): #pk一般是个id,是整数primary key
return HttpResponse('学生id为%s的详情页' % pk) -
urls.py文件中的demo:
urlpatterns = [
path('index/', views.index, name='index'), #index前不要加/,django自动添加,index后面要加/
path('login/', views.login),
path('detail/int:pk/', views.detail, name='detail'), #捕获的值传递给views.py里的detail(request,pk)的pk
] -
效果图:

模板的继承与引用
引用
-
将渲染好的模板放到想要放的模板中
-
用include标签将ad.html引用到index.html中
-
index.html中加入下面代码:
{% include 'students/ad.html' %}
-
ad.html文件中代码:
你看不见我,你看不见我
继承
- django模板引擎中最强大也是最复杂的部分就是模板继承了
- 模板集成可以让你创建一个基本的“骨架”模板,它包含你站点中的全部元素,并且可以定义能够被子模板覆盖的blocks
- 模板继承使用extends标签实现,通过使用block来给子模板开放接口
- extends必须是模板中的第一个出现的标签
- 子模板中的所有内容,必须出现在父模板定义好的block中,否则django将不会渲染
- 如果出现重复代码,就应该考虑使用模板
- 尽可能多的定义block,方便子模板实现更细的需求
- 如果在某个block中,要使用父模板的内容,使用block.super获取
- block相当于字符串中的占位符,当继承时就可以在block中间写继承模板自己的demo
- block用法:形如{% block content %}
我是base
{% endblock %},
content起定位作用
- block用法:形如{% block content %}
- block可以插入多个
不加block案例


- 效果图:

案例
-
base.html文件demo:
{% load static %}
{% block title %}base{% endblock %}
{% block link %}{% endblock %}
{% block content %}
{% endblock %}
{% block domready %}
{% endblock %}
-
index.html文件的demo:
{% extends 'students/base.html' %}
{% block title %}学生表{% endblock %}
{% load static %}
{% block link %}{% endblock %}
{% block content %}
{# 从这里开始替换#}
{# 如果students为空,则渲染empty下的内容#}
{% for stu in students %}
<tr {% if stu.age < 17 %}style="color:blue;"
{% elif stu.age > 16 and stu.age < 22 %}style="color:red;"
{% else %}style="color:green;"
{% endif %}>
{# forloop.counter获取当前for循环的迭代次数,以1开始#}
{# 硬编码跳转 #}
{# forloop.counter0获取当前for循环的迭代次数,以0开始#}
{# #}
{# forloop.revcounter获取当前for循环的迭代次数,从大到小#}
{# #}
{# forloop.revcounter0获取当前for循环的迭代次数,从大到小,最小为0#}
{# #}
{# 如果students为空,则渲染empty下的内容#}
{# {% empty %}#}
{# 要渲染的内容#}
{% endfor %}序号 姓名 年龄 性别 {{ forloop.counter }} {{ forloop.counter }} {{ forloop.counter0 }} {{ forloop.revcounter }} {{ forloop.counter0 }} {{ stu.name }} {{ stu.age }} {{ stu.gender }}
{# 将渲染好的模板放到想要放的模板#}
{% include 'students/ad.html' %}
{% endblock %}
{% block domready %}
-
效果图:

base模块用尽可能多的block,根据实际业务,宁多勿缺
浙公网安备 33010602011771号