标签:
django_template
template模板是一个简单的文本文件,可以生成文本格式(HTML,XML,CSV) 模板包含变量,这些变量将会被赋值
例如:
{% extends "base_generic.html" %} {% block title %}{{ section.title }}{% endblock %} {% block content %} <h1>{{ section.title }}</h1> {% for story in story_list %} <h2> <a href="{{ story.get_absolute_url }}"> {{ story.headline|upper }} </a> </h2> <p>{{ story.tease|truncatewords:"100" }}</p> {% endfor %} {% endblock %}
像 {{ variable }}
这种形式的就是变量。当模板引擎看到一个变量,会给它赋值并用赋值的结果来替换它。dot(.)号可以访问变量的属性 如 {{ section.title }}
将会用sectioon对象的title属性来替换 如果有不存在的变量,模板会插入TEMPLATE_STRING_IF_INVALID,默认是‘‘空字符串 "bar" : {{ foo.bar }}
这种会被表示成字符串而不会使用bar的值去替换
过滤器用来修改变量以输出 {{ name|lower }}
将会将name变量以小写形式输出 过滤去可以串起来用,如 {{ text|excape|linebreaks }}
过滤器也可以带参数,如: {{ bio|truncatewords:30 }}
输出bio变量的前30个字母
参数如果包含空格则必须用引号括起来,如以逗号和一个空格的形式将一个list连起来: {{ list|join:", " }}
{{ value|default:"nothing" }}
{{ 123456789|filesizeformat }}
输出117.7 MB{% tag %}
tags比变量稍微复杂,可以生成文本输出,可以控制逻辑和循环,也可以将一些外部信息导入模板以后给变量使用
一些标签包括开始和结束标签,形如{% tag %} tag content {% endtag %}
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> <% endfor %> </ul>
上面这个for标签可以访问列表中的每个运动员,它包括开始和结束标签
{% 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 %}
if标签可以和过滤器还有一些运算符一起使用:
{% if athlete_list|length > 1 %} Team: {% for athlete in athlete_list %} ... {% endfor %} {% else %} Athlete: {{ athlete_list.0.name }} {% endif %}
{# #}
eg: {# greeting #}hello
内容只有hello
这是django模板最强大也是最复杂的部分,允许我们创建一个基础的骨架模板,包含网站的基础元素,然后我们可以定义子模板来进行重载 base.html:
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}My amazing site{% endblock %}</title> </head> <body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div> </body> </html>
一个子模板:
{% extends "base.html" %} {% block title %}My amazing blog{% endblock %} {% block content %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}
这里用了extend标签表明是从基础模板扩展来的,模板引擎检测到base.html中的几个block标签,就会用子模板中这些blocks的内容进行替换,得到这样一个输出:
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>My amazing blog</title> </head> <body> <div id="sidebar"> <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> </div> <div id="content"> <h2>Entry one</h2> <p>This is my first entry.</p> <h2>Entry two</h2> <p>This is my second entry.</p> </div> </body> </html>
注意:
{{ block.super }}
来得到这些内容有时候用户提交的数据会有无法想象的事情发生,如Hello, {{ name }}
看起来只是简单的显示用户名,但是如果用户输入的名字是<script>alert(‘hello‘)</script>
则模板会渲染成:
Hello, <script>alert(‘hello‘)</script>
会导致浏览器弹出提醒框! 这会使网页存在被攻击的漏洞,如XSS(Cross Site Scripting)攻击等
django提供两种方案来解决这个问题
几种常见escape:
< | < |
> | |
‘ | ' |
" | " |
& | & |
这些都是默认转换的,只要使用django的模板系统就行
对于单个变量,可以使用safe过滤器,如:
This will be escaped: {{ data }} This will not be escaped: {{ data|safe }}
如果data的内容是‘<b>‘,则输出:
This will be escaped: <b> This will not be escaped: <b>
对于blocks,可以使用autoescape标签,如:
{% autoescape off %} Hello {{ name }} {% endautoescape %}
autoescape默认是on
一些应用提供一些标签和过滤器的库,如果要在模板中访问他们,首先要保证这个应用是在INSTALLED_APPS的,如‘django.contrib.humanize‘,访问intcomma过滤器
{% load humanize %} {{ 45000|intcomma }}
注意在base.html中load的应用不能直接应用到子模板,在子模板中必须再load一次
标签:
原文地址:http://www.cnblogs.com/jolin123/p/4343054.html