Djangotemplate

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

template是基于文本格式的文件(html文件也是文本格式),包含如下一些关键字:variables:当template被evaluated时,variable会被替换成相应的值,variable在模板中的格式:{{variable}},如果variable不存在,模板会使用TEMPLATE_STRING_IF_INVALID设置的值替换变量,默认是‘’.template中方法调用也是变量的一种,如{{blog.entry_set.all.count}},注意方法做变量时没办法传递参数,所以只能是无参方法作变量filters:用于修改variable,‘|’称为管道符,对变量应用filter,如{{name|low}},其中low就是一个filter,filter还可以有参数,也可以自定义filter。django中大概有三十种filter,常用的有:default:如果变量是false或者空,使用default值替换variable,{{value|default:”nothing”}},default的值默认不转义length:获取变量的长度,{{value|length}}striptags:除去html标签,{{value|striptags}}:value中含有标签时,标签会被删除只返回value的剩余部分escape:转义字符串中的html标签safe:使变量输出不会进行html转义,如果设置了自动转义关闭,这个filter就会失效comments:用于模板中注释,格式{##},注释中也可包含代码,{# {%if foo%}bar{%else%} #},模板evaluated时会正常执行tags:控制template的逻辑,格式{% tag %},部分tag还要有{% endtag %},django自带大约二十多个tag,常用的如下:for:用于数组循环for example<ul>

{% for athlete in athlete_list %}

<li>{{ athlete.name}}</li>

{% endfor %}

</ul>

if,elif,和else:if example{%ifathlete_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 %}

block和extends:模板继承时使用,block表示可以在子模板中改写的块,同一模板中的block名字不能相同,extends表示用于继承父模板模板继承:继承模板使用{% extends %},并且它必须是子模板中第一个tag推荐在base template中多使用{% block %}如果多个模板中有重复内容,则考虑将内容移到base template中的{% block %}下如果要在子模板的{%block%}中访问父模板的block内容可以使用{{block.super}}Django模板中默认开启了对用于输出的变量的html转义,如果要关闭转义功能,可以在变量,模板,site三个级别设置关闭关闭转义#关闭变量转义

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

#关闭template转义,继承自该模板的子模板也会关闭

{% autoescape off %}

Hello {{ name }}

{% endautoescape %}

Context 类:传递给模板,作用是替换模板中的变量。Context对象是个stack,所以包含push和pop方法,构造函数中可以包含两个参数:一个字典型,用于映射变量名和变量值当前application的名字,当url有命名空间时有用Context>>> c = Context()

>>> c['foo'] = 'first level'

>>> c.push()

{}

>>> c['foo'] = 'second level'

>>> c['foo']

'second level'

>>> c.pop()

{'foo': 'second level'}

>>> c['foo']

'first level'

>>> c['foo'] = 'overwritten'

>>> c['foo']

'overwritten'

>>> c.pop()

Traceback (most recent call last):

...

ContextPopException

RequestContext:Context的子类,其与Context有两个不同:第一个参数是HttPRequest对象会调用TEMPLATE_CONTEXT_PROCESSOR中的processor依次往RequestContext中加入一些预定义变量,自己也可以定义额外的processor再添加其他内容到RequestContext中RequestContext processorfrom django.httpimportHttpResponse

from django.templateimportRequestContext

def ip_address_processor(request):return{'ip_address': request.META['REMOTE_ADDR']}

def some_view(request):

# ...

c = RequestContext(request, {

'foo': 'bar',

}, [ip_address_processor])returnHttpResponse(t.render(c))

使用模板通常有两个步骤:compile模板存到一个对象中.模板只编译一次调用模板对象的render方法,参数是context

Template examplefrom django.templateimportContext, Template

t = Template("My name is {{ my_name }}.")

c = Context({"my_name": "Adrian"})

t.render(c)

"My name is Adrian."

c = Context({"my_name": "Dolores"})

t.render(c)

"My name is Dolores."

variable lookup:变量名中可以包含点,当点出现时,以{{foo.bar}}为例它的解析顺序为:dictionary lookup,如foo[“bar”]attribute lookup,如foo.barlist-index lookup,如foo[bar]method lookup

Variable lookupt = Template("My name is {{ person.first_name }}.")

d = {"person": {"first_name": "Joe", "last_name": "Johnson"}}

t.render(Context(d))

"My name is Joe."classPersonClass: pass

p = PersonClass()

p.first_name = "Ron"

p.last_name = "Nasty"

t.render(Context({"person": p}))

"My name is Ron."

t = Template("The first stooge in the list is {{ stooges.0 }}.")

c = Context({"stooges": ["Larry", "Curly", "Moe"]})

t.render(c)

"The first stooge in the list is Larry."

method lookup时,注意以下几点:调用方法抛出异常时,如果异常类型设置了”静态属性”silent_variable_failure=true,则变量会被替换为空,否则会替换为异常信息如果方法含有参数,则变量会被替换为空在模板中调用某些方法会产生负面影响如model.delete().为了防止这种情况可以设置alters_data=true.这样方法不会被调用,而是用TEMPLATE_STRING_IF_INVALID替换变量的值。model.delete方法的alters_data默认为true

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航