何谓转义?就是把html语言的关键字过滤掉。例如,<div>就是html的关键字,如果要在html页面上呈现<div>,其源代码就必须是&lt;div&gt; 
PS:转义其实就是把HTML代码给转换成HTML实体了!

默认情况下,django自动为开发者提供escape功能,即在html代码render之前,先进行转义,然后再呈现出来。这样的话,我们如果想输出一个链接,被转义之后,可能就无法得到我们想要的结果。 

例如,下面的method,如果用户是匿名用户,则输出“匿名用户”,否则,输出一个链接,指向用户的profile: 

def get_username(self): 

       return “<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username) 

在template文件中,如果这样使用上面的方法: 

{{topic.get_username}} 

这样,输出的结果不是一个链接,而是上面链接转义后的原文。我们无法得到我们想要的结果。 

有以下几种方法解决自动转义的问题: 

1、filter中 

修改filter函数的is_safe属性: 

@register.filter 

def myfilter(value): 

    return value 

myfilter.is_safe = True 

如果你需要更复杂一些,可以亲自来处理escape属性。 

首先,设置filter的need_autoesacpe属性为True(默认为False),这个参数告诉django,该filter需要一个传递一个autoesacape的参数,标示是否需要进行转义处理,如果为True,则转义,反之则反。完整的例子如下: 

from django.utils.html import conditional_escape 

from django.utils.safestring import mark_safe 

def initial_letter_filter(text, autoescape=None): 

    first, other = text[0], text[1:] 

    if autoescape: 

        esc = conditional_escape 

    else: 

        esc = lambda x: x 

    result = ‘<strong>%s</strong>%s’ % (esc(first), esc(other)) 

    return mark_safe(result) 

initial_letter_filter.needs_autoescape = True 

2、template中 

去掉template中的自动转义可以使用filter safe,也可以使用auotescape标签,还可以修改render的autoescape属性。 

使用safe filter: 

This will be escaped: {{ data }} 

This will not be escaped: {{ data|safe }} 

使用autoescape标签: 

Auto-escaping is on by default. Hello {{ name }} 

{% autoescape off %} 

    This will not be auto-escaped: {{ data }}. 

    Nor this: {{ other_data }} 

    {% autoescape on %} 

        Auto-escaping applies again: {{ name }} 

    {% endautoescape %} 

{% endautoescape %} 

如果在autoescape的标签中include 其他的tags,autoescape的属性将被子tags继承。 

修改Context类的autoescape属性: 

def render(self, context): 

    # … 

       new_context = Context({‘var’: obj}, autoescape=context.autoescape) 

注:autoescape标签的优先级高于Context类的autoescape属性,即如果Context中autoescape设置与模板中autoescape标签冲突,则使用autoescape标签的autoescape设置值。 

>>> from django import template 

>>> H=’{% autoescape off %}{{div}}{% endautoescape %}’ 

>>> c = template.Context({’div’:”<div>”}, autoescape=True) 

>>> template.Template(H).render(c) 

u’<div>’ 

>>> 

>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’ 

>>> c = template.Context({’div’:”<div>”}, autoescape=True) 

>>> template.Template(H).render(c) 

u’&lt;div&gt;’ 

>>> H=’{% autoescape on %}{{div}}{% endautoescape %}’ 

>>> c = template.Context({’div’:”<div>”}, autoescape=False) 

>>> template.Template(H).render(c) 

u’&lt;div&gt;’ 

>>> 

3、使用方法函数mark_safe 

使用mark_safe函数标记后,django将不再对该函数的内容进行转义,上面的get_username可以修改为: 

from django.utils.safestring import mark_safe 

def get_username(self): 
      return mark_safe(”<a href=’/accounts/%s/’>%s</a>” %(self.user.id, self.user.username))
 
0

DJANGO基础学习之转义总结:escape,autoescape,safe,mark_safe的更多相关文章

  1. Django基础学习二

    今天继续学习django的基础 学习用户提交url如何获得返回值 1.首先需要在工程的urls文件定义指定的urls要路由给哪个函数 在这个例子中,我们定义home的urls路由给views里的tes ...

  2. Django基础学习笔记

    Django开发流程 创建一个django项目:命令:django-admin startproject 项目名 进入到项目并创建一个应用:命令:python manage.py startapp 应 ...

  3. Django基础学习七之如何配置django+mysql

    很久没有更新博客了,也有段时间没有持续性的学习了,感觉堕落了,今天继续开始学习吧 今天主要来学习一下在django下配置mysql的数据库和使用admin用户管理数据库 1.在project中的set ...

  4. Django基础学习六之渲染

    今天简单的介绍一下Django的template的渲染和Django的template的基本的语法 首先我们先启动一个django的shell,首先需要进入django的工程目录下启动django的s ...

  5. Django基础学习五_引入静态文件

    今天继续学习Django,今天主要掌握两个小点 一.如果为Django项目中引入静态文件 1.先要在project目录下创建static的目录,然后将jquery文件拷贝这个目录下就可以了 2.在pr ...

  6. Django基础学习四_数据库的增删改查

    今天主要学习两个东西 1.如何对数据库做增删改查 2.如果将数据库中的数据用html的方式返回到前台 一.对数据库中增删改查操作 1.首先需要先见表,见表的方法我们在“http://www.cnblo ...

  7. Django基础学习三_路由系统

    今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为静态路由.动态路由.二级路由 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配 ...

  8. Django基础学习一

    Django需要安装Django和jinja2,所以在开始学习之前,要先按照Django模块和jinja2模块,Django默认的数据库是SQLite,所以建议大家在学习之前需要先安装SQLite 一 ...

  9. Django基础学习之Cookie 和 Sessions 应用

    在Django里面,使用Cookie和Session看起来好像是一样的,使用的方式都是request.COOKIES[XXX]和request.session[XXX],其中XXX是您想要取得的东西的 ...

随机推荐

  1. 将服务费用DIY到底----走出软件作坊:三五个人十来条枪 如何成为开发正规军(十)[转]

    前一段时间,讲了一系列开发经理.实施经理.服务经理的工具箱:开发经理的工具箱---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三) ,实施经理的工具箱--走出软件作坊:三五个人十来条枪 如何成 ...

  2. Mac下使用Automator实现截屏编辑保存

    以前在Windows下使用百度或者搜狗输入法的截图工具很方便.❶快捷键(Alt+X,我设置的是这个),❷选择区域,❸编辑所选区域,包括添加文字,线条框框,调色,❹点击『✔️』选择保存位置,修改文件名保 ...

  3. android 下的技巧

    1.删除屏幕的手势锁定 adb shell #登录 su $切换到su用户(手机需要root) cd /data/system #切换目录 rv gesture.key # 删除锁屏文件,然后进去的时 ...

  4. 利用arcigs制作出 源解析要用的ASCII文件

    准备:1.确定好模拟区域范围,精度,行列数          2.确定好源解析的城市规划 思路: 1.全国省级图+本地市县图-->合成一张区域图(联合) 合成之后,添加一个字段,一个数字类型字段 ...

  5. centos7重启rsyslog服务|centos7重启syslog服务

    centos7重启rsyslog服务: systemctl restart rsyslog 使用:(killall无效) killall -HUP rsyslog

  6. Effective C++第三遍

    试图调用private的copy或赋值函数是编译期错误,而调用没有具体定义的函数则是连接期错误. 以对象管理资源:智能指针RAII(资源获取立即初始化)后都是对象,但有时候,比如(API的)函数参数要 ...

  7. C++中this指针的用法详解

    转自 http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响s ...

  8. C++ Template Operator

    #include <iostream> #include <string> #include <deque> #include <stdexcept> ...

  9. mha的搭建步骤(一主一从架构)

    所需脚本文件到这里下载:http://note.youdao.com/share/web/file.html?id=ae8b11a61f7a8aa7b52aac3fcf0c4b83&type= ...

  10. hdu 1016 Prime Ring Problem(深度优先搜索)

    Prime Ring Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...