Django
- 标签在渲染的过程中提供任意的逻辑
- 标签语法: 由%}和 {% 来定义的,例如:{%tag%} {%endtag%}
- 这个定义是刻意模糊的。 例如,一个标签可以输出内容,作为控制结构,例如“if”语句或“for”循环从数据库中提取内容,甚至可以访问其他的模板标签。
配置好url和视图
views.py
# 模板标签 def tem_tags(request): return render(request, 'book/tags.html', context={ 'str1': 'Django', 'str2': 'Flask', 'fruit_list': ['apple', 'pear', 'orange'], 'num_list': ['one', 'two', 'three'], "whats_your_name": 'whoaU?', 'html': '<h1>hello world</h1>' })
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板标签</title> <style> </style> </head> <body> <p></p> if elif else {% if str1 == 'tornado' %} 这是tornado课程 {% elif str1 == str2 %} 这是scrapy课程 {% else %} 这是{{ str1 }}课程 {% endif %} <br> ifnotequal ifequal {% ifnotequal str1 str2 %} {{ str1 }}{{ str2}}是两个不同的课程 {% endifnotequal %} <br> {% for foo in fruit_list %} {{ foo }}<br> {% endfor %} <br> forloop.counter0 {% for foo in fruit_list %} {{ forloop.counter }} {% if forloop.counter0 == 1 %} {{ foo }}是梨子 <br> {% elif forloop.counter0 == 0 %} {{ foo }}是苹果 <br> {% else %} {{ foo }}是橘子 {% endif %} {% endfor %} <br> first last {% for foo in fruit_list %} {% if forloop.first %} first is {{ foo }} <br> {% endif %} {% if forloop.last %} last is {{ foo }} <br> {% endif %} {% endfor %} <br> forloop.parentloop. {% for foo in num_list %} {% for fo in fruit_list %} {% if forloop.parentloop.counter0 == 1 %} {{ foo }} better {{ fo }} <br> {% else %} {{ foo }} {{ fo }} <br> {% endif %} {% endfor %} {% endfor %} <br> url <a href="{% url 'static' %}">跳转到静态文件演示页面(参数后面用空格隔开)</a> <br> with {% with whats_your_name as o %} {{ o }}<br> {% endwith %} <br> autoescape {% autoescape on %} {{ html }} {% endautoescape %} <br> {% autoescape off %} {{ html }} {% endautoescape %} </body>
页面结果:
- Django模版引擎中最强大也是最复杂的部分就是模版继承了。 模版继承可以让你创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。
- 模板继承使用extends标签实现。通过使用block来给子模板开放接口。
- 1、extends必须是模板中的第一个出现的标签。
- 2、子模板中的所有内容,必须出现在父模板定义好的block中,否则django将不会渲染。
- 3、如果出现重复代码,就应该考虑使用模板。
- 4、尽可能多的定义block,方便子模板实现更细的需求。
- 5、如果在某个block中,要使用父模板的内容,使用block.super获取。
在模板文件夹中新建两个html文件
base.html文件中:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}base{% endblock %}</title> <style> </style> </head> <body> {% block content %} <p>这是基类模板文件</p> {% endblock %} {% block last %} <p>这是结尾的模板内容</p> {% endblock %} </body> </html>
index_1.html文件中:
{% extends 'inheritance_reference/base.html' %}
然后配置到url和view视图将index_1渲染出来:
现在我们来更改block里面的内容,做成我们自己的东西,将index_1.py中对应名字的block内容进行更改
{% extends 'inheritance_reference/base.html' %} {% block title %} 我自己的网页 {% endblock %} {% block content %} <p>这是我自己的中心内容,不是继承来的</p> {% endblock %} {% block last %} <p>这是我自己的结尾内容,不是继承来的</p> {% endblock %}
再渲染出来查看
接下来我们来继承父类base中的内容,并加上我们自己的内容
{% extends 'inheritance_reference/base.html' %} {% block title %} 我自己的网页 {% endblock %} {% block content %} {{ block.super }} <p>这是我自己的中心内容,不是继承来的</p> {% endblock %} {% block last %} {{ block.super }} <p>这是我自己的结尾内容,不是继承来的</p> {% endblock %}
现在再base中的block外面添加一句话,在index_1中也添加一句话
base.py
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}base{% endblock %}</title> <style> </style> </head> <body> {% block content %} <p>这是基类模板文件</p> {% endblock %} {% block last %} <p>这是结尾的模板内容</p> {% endblock %} <p>这是base没有block包括的内容</p> </body> </html>
index_1.py中:
{% extends 'inheritance_reference/base.html' %} {% block title %} 我自己的网页 {% endblock %} {% block content %} {{ block.super }} <p>这是我自己的中心内容,不是继承来的</p> {% endblock %} {% block last %} {{ block.super }} <p>这是我自己的结尾内容,不是继承来的</p> {% endblock %} <p>这是index_1中没有block包括的内容</p>
查看结果:
子模板中的所有内容,必须出现在父模板定义好的block中,否则django将不会渲染。