一、模板的组成
html代码和逻辑控制代码
二、逻辑控制代码的形式
1、变量(使用双大括号引用变量)
a、template和context
语法 : {{ var_name }}
模板系统不仅可以传字符串,它可以传递任意对象,对于向列表、字典、元组等对象,我们可以用句点来处理,叫做深度变量的查找
eg
对应views.py
def index(request):l = [1, 2, 3]return render(request, 'index.html', locals())
对应index.html
<body> <h1>传递过来的列表的第一个元素是 {{ l.0 }}</h1> </body>
浏览器返回
传递过来的列表的第一个元素是 1
b、变量的过滤器filter
语法格式 : {{ 对象|filter:参数}}
过滤器中有add、addslashes、capfirst、cut、date、default、default_if_none等
add:给变量加上相应的值
addslashes:给变量中的引号前加斜线
capfirst:首字母大写
cut:去除指定字符
date:格式化时间
。。。
如果传入的变量是一段标签,并想要实现其功能,则应给使用safe函数
eg:
不用safe函数
<body> <h1>传递过来的列表的第一个元素是 {{ l.0 }}</h1> 这是一个{{ s }} </body>
浏览器输出
这是一个<a href='#'>跳转链接</a>
使用safe函数
<body> <h1>传递过来的列表的第一个元素是 {{ l.0 }}</h1> 这是一个{{ s|safe }} </body>
浏览器输出
这是一个跳转链接
autoescape也可以实现同样的功能
eg
<body> <h1>传递过来的列表的第一个元素是 {{ l.0 }}</h1> 这是一个{{ s|safe }}<br> {% autoescape off %}这是一个{{ s }} {% endautoescape %} </body>
2、标签(tag)的使用(使用大括号和百分比的组合来表示使用tag)
语法:{% tag %}
a、{% if %}的使用,做判断,有if就要有{% endif %}
eg:
{% if l.0 > 3 %}<h2>{{ l.0 }}{% else %}<h2>{{ l.2 }} {% endif %} </h2>
b、{% for %}的使用,做遍历,同样有for就要有{% endfor %}
eg:
{% for num in l %}<p>{{ num }}</p> {% endfor %}
for循环中还内置了forloop模板变量,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1,forloop.counter0,从0开始计数,forloop.revcounter反转计数,forloop.first第一次循环时其值为True
eg:
{% for num in l %}<p>{{ forloop.counter0 }}:{{ num }}</p><p>{{ forloop.counter }}:{{ num }}</p> {% endfor %}
c、{%csrf_token%}:csrf_token标签
当用post的方法提交表单时,django会报一个错误,这是django一个保护机制,用来防止跨站攻击
eg:
<form action="/blog/register/" method="post">姓名<input type="text" name="username"><br>密码<input type="text" name="psw"><br><input type="submit"> </form>
报错信息
Forbidden (403)
CSRF verification failed. Request aborted.
You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties.
If you have configured your browser to disable cookies, please re-enable them, at least for this site, or for 'same-origin' requests.
添加后顺利提交
<form action="/blog/register/" method="post">姓名<input type="text" name="username"><br>密码<input type="text" name="psw"><br><input type="submit">{% csrf_token %} </form>
d、{% url %} 引用路由配置的地址
eg:
<form action="{% url 'reg' %}" method="post">姓名<input type="text" name="username"><br>密码<input type="text" name="psw"><br><input type="submit">{% csrf_token %} </form>
req为路由配置中的别名
e、{% verbatim %}: 禁止render,有开始就有结束{% endverbatim %}
包含在其中的代码将不被render渲染
f、{% load %}: 加载标签库
g、{% with %}:用更简单的变量名替代复杂的变量名,需要{% endwith %}
eg:
{% with s=qwer %}{{ s }}
{% endwith %}
注意:s=qwer之间不得有空格,否则报错
3、自定义filter和simple_tag
a、在app中创建templatetags模块(必须的)
b、创建任意 .py 文件,如:mytag.py
eg:
自定义
from django import template from django.utils.safestring import mark_saferegister = template.Library()#变量名必须时register@register.filter def filter_mul(a, b):return a*b@register.simple_tag() def tag_mul(a, b):return a*b
如何使用
在html文件的第一行加载{% load mytag %}即可,这里创建的文件为mytag.py
eg:
{% load mytag %} <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>BBU</title> </head>
需要注意的是 filter可以用在if等语句后,simple_tag不可以
三、模板的继承
1、如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。
2、一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越多越好
3、如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。如果你需要访问父模板中的块的内容,使用 {{ block.super }}这个标签吧,这一个魔法变量将会表现出父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了
4、不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为block 标签的工作方式是双向的。也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容
eg:
a、创建base.html模板
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> {% block base1 %} <p>我是模板</p> {% endblock %} <form action="{% url 'reg' %}" method="post">姓名<input type="text" name="username"><br>密码<input type="text" name="psw"><br><input type="submit">{% csrf_token %} </form> </body> </html>
b、创建子模板register.html,并利用{{ block.super }}输出父模板中代码块中的内容
{% extends 'base.html' %} #继承自base.html{% block base1 %}<p>{{ s }}</p> #s为后端传入的变量{{ block.super }} {% endblock %}
访问register.html