Django Template模板
作为一个网络框架,Django的需要一种动态生成HTML的便捷方法。最常用的方法依赖于模板。模板包含所需HTML输出的静态部分以及描述动态内容将被插入的一些特殊语法。
模板语言Jinja2
变量
{{ foo }}
{{ foo.bar }}
使用点 .
访问变量的属性。
filter
变量可以通过过滤器修改。语法{ { 变量|过滤器 }},并且也可以用冒号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为后一个过滤器的输入。
{{ list|join:', ' }} {{ name|striptags|title }}
内置过滤器清单
abs(value):返回一个数值的绝对值。 default(value,default_value,boolean=false):如果当前变量没有值,则会使用参数中的值来代替。 escape(value):转义字符,会将<>等符号转义成HTML中的符号。 first(value):返回一个序列的第一个元素。 format(value,*arags,**kwargs):格式化字符串。 last(value):返回一个序列的最后一个元素。 length(value):返回一个序列或者字典的长度。 join(value,d=u''):将一个序列用d这个参数的值拼接成字符串。 safe(value):如果开启了全局转义,那么safe过滤器会将变量关掉转义。 int(value):将值转换为int类型。 float(value):将值转换为float类型。 lower(value):将字符串转换为小写。 upper(value):将字符串转换为小写。 replace(value,old,new): 替换将old替换为new的字符串。 truncate(value,length=255,killwords=False):截取length长度的字符串。 striptags(value):删除字符串中所有的HTML标签,如果出现多个空格,将替换成一个空格。 trim:截取字符串前面和后面的空白字符。 string(value):将变量转换成字符串。 wordcount(s):计算一个长字符串中单词的个数。
if
if标签也可以使用and, or, not, ==, !=, <, >,, <=, >=, in ,not in, is, is not。
{% if athlete_list %} Number of athletes: {{ athlete_list|length }} {% elif athlete_in_locker_room_list %} Athletes should be out of the locker room soon! {% else %} No athletes. {% endif %}
for
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
csrf_token
用于CSRF保户,防止跨站点请求伪造。
<form action="/app/login.html" method="POST"> {% csrf_token %} <input id="username" type="text" name="username" placeholder="用户名"> <input id="password" type="password" name="password" placeholder="密码"> <input id="submit" type="submit" value="登陆"> </form>
with
以更简单的名称缓存复杂变量。对一些复杂变量的设置别名,可以设置多个变量。
{% with total=business.employees.count one=1 %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
url
可以对URLconf中的规则设置别名,然后使用url标签访问。
urls.py设置name属性为logout
re_path(r'logout.html$', Logout.as_view(), name="logout")
模板中
<a href={% url "logout" %}>注销</a> <!-- 或者 --> {% url "logout" as the_url %} <a href={{ the_url }}>注销</a>
模板继承
{% block %}:标签:在父模板中预留区域,在子模板中填充;
{% extends %}:标签:写在子模板的第一行,标明继承对象;
{{ block.super }}:从父模板获取块的内容,而不是直接覆盖。
基本模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用户管理</title> <style> body{ margin: 0 auto; padding: 0; height: 100%; width: 100%; } // 定义一个css的继承块 {% block style %} {% endblock %} </style> </head> <body> <div class="content"> // 定义一个内容的继承块 {% block content %} {% endblock %} </div> <script> // 定义一个JavaScript的继承块 {% block script %} {% endblock %} </script> </body> </html>
子模版
<!-- 指定继承的模板 --> {% extends "myapp/base.html" %} <!-- 在模板基础上添加css样式 --> {% block style %} .content .content-main{ margin: 0 auto; width: 80%; } {% endblock %} <!-- 在模板基础上添加内容 --> {% block content %} <!-- 继承父模板block中的代码 --> {{ block.super }} <div class="content-main"> <h1>hello {{ user }}</h1> <a href="/logout.html">注销</a> </div> {% endblock %} <!-- 在模板基础上添加js代码 --> {% block script %} window.onload = function(){ alert("hello") } {% endblock %}
自动HTML转义
Django具有自动HTML转义功能,可以防止跨站点脚本(XSS)攻击;
默认情况下,Django中的每个模板都会自动转义每个变量标记的输出:
- < 转换为 <
- > 转换为 >
- ' (单引号)转换为 '
- " (双引号)转换为 "
- & 转换为 &
使用safe过滤器,可以禁用单个变量的自动转义;
{% autoescape %}可以对代码块进行转义控制;
{{ data|safe }}
# 禁用转义
{% autoescape off %}
This will not be auto-escaped: {{ data }}.
Nor this: {{ other_data }}
# 开启自动转义
{% autoescape on %}
Auto-escaping applies again: {{ name }}
{% endautoescape %}
{% endautoescape %}
自定义过滤器
过滤器只能传递一个参数。
创建一个包,布局如下:
myapp/
__init__.py
models.py
templatetags/
__init__.py
myapp_extras.py
views.py
在myapp_extras.py中自定义过滤器
from django import template register = template.Library() # 使用装饰器注册自定义过滤器 @register.filter def my_cut(value, arg): return value.replace(arg, ', ') # 函数注册自定义过滤器 # register.filter('my_cut', my_cut)
在模板中引用
# 首先要使用load标签加载自定义过滤器 {% load my_tags %} # 使用自定义过滤器,并传入参数 {{ user|my_cut:',' }}
自定义标签
标签可以接受多个参数。
在myapp_extras.py中自定义标签
from django import template register = template.Library() @register.simple_tag # 可以传入各种参数 def my_tag(a, *args, **kwargs): b = kwargs['message'] return str(a) + str(b)
在模板中引用
# 首先要使用load标签加载自定义过滤器 {% load my_tags %} # 使用自定义标签,并传入参数 {% my_tag 1 user.name message="it's ok"%}