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>
base.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 %}
index.html

自动HTML转义

Django具有自动HTML转义功能,可以防止跨站点脚本(XSS)攻击;

默认情况下,Django中的每个模板都会自动转义每个变量标记的输出

  • < 转换为 &lt;
  • > 转换为 &gt;
  • ' (单引号)转换为 &#39;
  • " (双引号)转换为 &quot;
  • & 转换为 &amp;

使用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"%}

 

posted @ 2019-07-08 18:15  houyongchong  阅读(198)  评论(0编辑  收藏  举报