何谓转义?就是把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. php使用过滤器filter_var轻松验证邮箱url和ip地址等

    以前使用php的时候还不知道有过滤器filter这玩意,那时候判断邮箱.url和ip地址格式是否符合都是用正则表达式.后来随着使用的逐渐深入,才知道在php中也可以使用内置的函数库过滤器filter来 ...

  2. UTF8转码, 考虑利用app转好再传, CC2541转太麻烦了...

  3. eclipse折叠快捷键

    之前按代码折叠快捷键的时候发现时而灵时而不灵,今天突然发现了问题所在: 按ctrl+/(小键盘)使代码左边出现折叠标志 然后再按ctrl+shift+/(折叠)   , ctrl+shift+*(展开 ...

  4. Failed to read auto-increment value from storage engine, Error Number: 1467

    重设auto_increment:ALTER TABLE tableName auto_increment=number

  5. oracle 11g升级

    手先需要下载oracle11g的补丁安装包,一般只有付费用户才能获取到该安装包,其他用户获取不到,那怎么办呢? 万能的互联网可以办到,可以用http://www.wangpansou.cn/所有其他用 ...

  6. restful 注解

    @Path @Path 注释被用来描述根资源.子资源方法或子资源的位置.value 值可以包含文本字符.变量或具有定制正则表达式的变量. @GET.@POST.@PUT.@DELETE.@HEAD @ ...

  7. PHP和Java的主要区别有哪些呢?

    解释 PHP与Java作为两种截然不同的程序开发语言,无论是技术层面还是发展空间,亦或是市场份额占比,都有着不同的表现方式,理念上的不同导致了Java和PHP在Web应用开发上显示了不同的结果.若要一 ...

  8. string转换成color转

    string转换成color             string col = "#FF8400";            this.BackColor = System.Draw ...

  9. HDU 5961:传递(暴搜)

    http://acm.hdu.edu.cn/showproblem.php?pid=5961 题意:中文题意.给出两个图,判断这个两个图是否都是传递的.注意一下传递的定义要看清,一开始没看清连样例都看 ...

  10. Android Studio解决unspecified on project app resolves to an APK archive which is not supported

    出现该问题unspecified on project app resolves to an APK archive which is not supported as a compilation d ...