Django的模板语言的目的是取得力量和易用性之间的平衡,与其他的模板语言相比,django模板语言显得更简单,更专一,

django模板系统由模板,变量,过滤器,标签,注释等主要部分组成

模板

一个模板是一个简单的文本文件,它可以生成任何基于文本的格式,html,csv,xml等等

模板里面包含变量,过滤器,标签和注释,下面是一个简单的模板文件

{% 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 }}

变量解析:当模板引擎碰到一个变量的时候,会计算变量然后用结果去代替他

变量的命名:字母数字和下划线的组合,.(点号)不可用,因为点号有特殊的意义

如果变量不存在的时候,{{variable}}会被解析为''(一个空字符串)

过滤器

修改变量的展示方式

格式:{{ variable|filter }},展示变量经过filter后的结果,例如{{ name|lower }}战术name的小写形式,|是管道

filter可以串联,例如{{ text|escape|linebreaks }}

filter可以有参数,用冒号表示,例如 {{ bio|truncatewords:30 }}

filter参数如果有空格,必须用引号括起来,例如:{{ list|join:", " }}

django有很多内建的过滤器,我们下一节再讲,因为有30个之多,足以成一节了

标签

标签比变量和过滤器要复杂的多,有些是在输出上产生内容,有些是控制文本流(通过循环和逻辑),还有一些是加载外部的一些内容进入模板

格式:{% tag %}

标签基本都是成对出现的,如:{% tag %} ... tag contents ... {% endtag %}

django内建的标签有很多,接近40个,足以成一节,下下节再说的

注释

注释,不用解释了吧

格式:{# #}

但是这个注释标签只能注释单行的文本

如果你想注释多行的话,要通过comment标签

模板继承

模板系统最有力也是最复杂的部分--模板继承,你可以在父模板中使用block标签定义一些列的变量,然后再字模板中覆盖他们,看下面的例子:

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标签

{% 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 %}

渲染的效果如下:子模板中有的标签会覆盖父模板的内容如title,子模板没有覆盖的标签将从父模板哪里继承过来,如sidebar

<!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>

下面是一些tips:

  • 如果你要使用extends标签,请确保extends在子模板中时第一个标签
  • 在父模板中的block标签越多越好
  • 如果你在多个子模板中出现了重复的内容,是时候考虑把它们放到父模板里面了
  • {{ block.super }} 可以访问父模板中对应block的值,当你仅仅是想在父模板的基础上添加内容而不是覆盖的时候 ,可能会用到这个值

自动HTML转义

威胁主要来自跨站点攻击(XXS)

很明显,用户提交的内容是不能被盲目的信任的,因为一些别有用心的用户可能会利用这种盲目的信任来做一些你意想不到的事情,例如在内容中内嵌了一段javascript代码等等,所以django是默认自动转义的,即是有下面的转换

  • < is converted to &lt;
  • > is converted to &gt;
  • ' (single quote) is converted to '
  • " (double quote) is converted to &quot;
  • & is converted to &amp;

如果你真的要放弃自动转义,或者你有自己的需要的,或者你确信用户的输入没有威胁的时候,你可以关闭自动HTML转义

在变量中,你可以这样做

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

在标签中,你可以这样做

{% autoescape off %}
This will not be auto-escaped: {{ data }}. Nor this: {{ other_data }}
{% autoescape on %}
Auto-escaping applies again: {{ name }}
{% endautoescape %}
{% endautoescape %}

访问方法调用

在模板中,大多数的方法调用还是可用的,但,方法是不可能在模板中定义的,所有的属性方法必须在模板之前定义好

{% for comment in task.comment_set.all %}
{{ comment }}
{% endfor %}
{{ task.comment_set.all.count }}
# In model
class Task(models.Model):
def foo(self):
return "bar" # In template
{{ task.foo }}

p

10:django 模板语言的更多相关文章

  1. Django模板语言初识

    一.Django框架简介 1.MVC框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...

  2. Django模板语言的复用

    一.include标签 由于在项目中,往往会出现多个页面拥有一个或几个相同的页面版块,或是一个页面多个页面版块是相同的,基于这个问题,我们可以采用模板语言复用include标签来帮我们解决,这样就避免 ...

  3. Django模板语言相关内容 Djan

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  4. Django——模板语言相关内容

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  5. Django模板语言与视图(view)

    常用语法 {{  }}和{% %} 变量相关的用{{}} , 逻辑相关的用{% %} 变量 在Django的模板语言中按此语法使用:{{ 变量名 }}. 当模版引擎遇到一个变量,它将计算这个变量,然后 ...

  6. Django模板语言,过滤器整理

    Django模板语言,过滤器整理 1. add {{ value|add:"2" }} 把add后的参数加给value: 处理时,过滤器首先会强制把两个值转换成Int类型. 如果强 ...

  7. Django模板语言,标签整理

    Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...

  8. Django模板语言(一)

    1,Django模板语言 1.1>基础语法:1.1.1,变量相关:{{ 变量名 }},1.1.2,逻辑相关{% ... %} 在Django模板语言中按此语法使用:{{ 变量名 }},当模板引擎 ...

  9. Django模板语言 标签整理

    Django模板语言 标签 内置标签引用 1. autoescape 控制自动转义是否可用. 这种标签带有任何 on 或 off 作为参数的话,他将决定转义块内效果. 该标签会以一个endautoes ...

随机推荐

  1. POJ1228:Grandpa's Estate——题解

    http://poj.org/problem?id=1228 题目大意:给一个凸包,问是否为稳定凸包. ———————————————————————— 稳定凸包的概念为:我任意添加一个点都不能使这个 ...

  2. bzoj3694: 最短路(树链剖分/并查集)

    bzoj1576的帮我们跑好最短路版本23333(双倍经验!嘿嘿嘿 这题可以用树链剖分或并查集写.树链剖分非常显然,并查集的写法比较妙,涨了个姿势,原来并查集的路径压缩还能这么用... 首先对于不在最 ...

  3. [学习笔记]2-SAT 问题

    (本文语言不通,细节省略较多,不适合初学者学习) 解决一类简单的sat问题. 每个变量有0/1两种取值,m个限制条件都可以转化成形如:若x为0/1则y为0/1等等(x可以等于y) 具体: 每个变量拆成 ...

  4. selenium - webdriver - ActionChains类(鼠标操作)

    ActionChains 类提供了鼠标操作的常用方法: perform(): 执行所有 ActionChains 中存储的行为: context_click(): 右击: double_click() ...

  5. #define与typedef

    #define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名), ...

  6. (转)关于block使用的5点注意事项

    1.在使用block前需要对block指针做判空处理. 不判空直接使用,一旦指针为空直接产生崩溃. if (!self.isOnlyNet) { if (succBlock == NULL) { // ...

  7. Merge Query

    1. Oracle: "MERGE into MHGROUP.proj_access m using dual on " + "(PRJ_ID = '" + W ...

  8. noip2012~2015刷题小记录

    2012d1t1 密码 模拟题 #include<cstdio> #include<cstdlib> #include<cstring> #include<c ...

  9. 【BZOJ4819】【SDOI2017】新生舞会 [费用流][分数规划]

    新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 学校组织了一次新生舞会,Cathy ...

  10. iOS-Apple苹果iPhone开发公开API

      iOS-Apple苹果iPhone开发 //技术博客http://www.cnblogs.com/ChenYilong/   新浪微博http://weibo.com/luohanchenyilo ...