django模板常用语法规则

六尺巷人_CDS 六尺巷人_CDS     2022-11-16     256

关键词:

 

Django 模板标签

if/else 标签 for 标签 ifequal/ifnotequal 标签
注释标签 过滤器 include 标签
URL标签 模板继承  

 

if/else 标签
1. 基本语法格式如下:
% if condition %
... display
% endif %
或者:

% if condition1 %
... display 1
% elif condiiton2 %
... display 2
% else %
... display 3
% endif %
根据条件判断是否输出。if/else 支持嵌套。

Note:模板标签中的变量是不用包含的。

2. % if % 标签接受 and , or 或者 not 关键字来对多个变量做判断 ,或者对变量取反( not ),例如:

% if athlete_list and coach_list %
athletes 和 coaches 变量都是可用的。
% endif %
Note:

1. % if % 标签不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的,这样的代码是不合法的:

% if athlete_list and coach_list or cheerleader_list %
2. 系统不支持用圆括号来组合比较操作。 如果你确实需要用到圆括号来组合表达你的逻辑式,考虑将它移到模板之外处理,然后以模板变量的形式传入结果吧。 或者,仅仅用嵌套的%if%标签替换


for 标签

1. % for % 允许我们在一个序列上迭代。与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。

每一次循环中,模板系统会渲染在 % for % 和 % endfor % 之间的所有内容。

例如,给定一个运动员列表 athlete_list 变量,我们可以使用下面的代码来显示这个列表:
<ul>
% for athlete in athlete_list %
<li> athlete.name </li>
% endfor %
</ul>
2. 给标签增加一个 reversed 使得该列表被反向迭代:

% for athlete in athlete_list reversed %
3. 可以嵌套使用 % for % 标签。

在执行循环之前先检测列表的大小是一个通常的做法,当列表为空时输出一些特别的提示。`` for`` 标签支持一个可选的`` % empty %`` 分句,通过它我们可以定义当列表为空时的输出内容 下面的例子与用if-else实现等价:

% for athlete in athlete_list %
<p> athlete.name </p>
% empty %
<p>There are no athletes. Only computer programmers.</p>
% endfor %
4. Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。

5.在每个`` % for %``循环里有一个称为`` forloop`` 的模板变量。这个变量有一些提示循环进度信息的属性。

forloop.counter 总是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,所以在第一次循环时forloop.counter 将会被设置为1。

% for item in todo_list %
<p> forloop.counter : item </p>
% endfor %
forloop.counter0 类似于forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。

forloop.revcounter 是表示循环中剩余项的整型变量。 在循环初次执行时forloop.revcounter 将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1。

forloop.revcounter0 类似于forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1。

forloop.first 是一个布尔值,如果该迭代是第一次执行,那么它被置为```` 在下面的情形中这个变量是很有用的:

System Message: WARNING/2 (<string>, line 1071);backlink

Inline literal start-string without end-string.

% for object in objects %
% if forloop.first %<li class="first">% else %<li>% endif %
object
</li>
% endfor %
forloop.last 是一个布尔值;在最后一次执行循环时被置为True。 一个常见的用法是在一系列的链接之间放置管道符(|),另一个常见的用途是为列表的每个单词的加上逗号。

% for link in links % link % if not forloop.last % | % endif %% endfor %
上面的模板可能会产生如下的结果:

Link1 | Link2 | Link3 | Link4
forloop.parentloop 是一个指向当前循环的上一级循环的forloop 对象的引用(在嵌套循环的情况下)。
% for country in countries %
<table>
% for city in country.city_list %
<tr>
<td>Country # forloop.parentloop.counter </td>
<td>City # forloop.counter </td>
<td> city </td>
</tr>
% endfor %
</table>
% endfor %
forloop 变量仅仅能够在循环中使用。 在模板解析器碰到%endfor%标签后,forloop就不可访问了。

6. Context和forloop变量

在一个 % for% 块中,已存在的变量会被移除,以避免forloop 变量被覆盖。 Django会把这个变量移动到forloop.parentloop 中。通常我们不用担心这个问题,但是一旦我们在模板中定义了forloop 这个变量(当然我们反对这样做),在%for% 块中它会在forloop.parentloop 被重新命名。

ifequal/ifnotequal 标签
1. % ifequal % 标签比较两个值,当他们相等时,显示在 % ifequal % 和 % endifequal % 之中所有的值。

下面的例子比较两个模板变量 user 和 currentuser :

% ifequal user currentuser %
<h1>Welcome!</h1>
% endifequal %
Note:只有模板变量,字符串,整数和小数可以作为 % ifequal % 标签的参数。其他任何类型,例如Python的字典类型、列表类型、布尔类型,不能用在%ifequal% 中。

2. % ifequal % 支持可选的 % else% 标签:8

% ifequal section ‘sitenews‘ %
<h1>Site News</h1>
% else %
<h1>No News Here</h1>
% endifequal %

注释标签
1. Django单行注释使用 # #。

# 这是一个注释 #
用这种语法的注释不能跨越多行。 这个限制是为了提高模板解析的性能。 在下面这个模板中,输出结果和模板本身是 完全一样的(也就是说,注释标签并没有被解析为注释):

This is a # this is not
a comment #
test.
2. 实现多行注释,可以使用`` % comment %`` 模板标签

% comment %
This is a
multi-line comment.
% endcomment %

过滤器
1. 模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:

name|lower
name 变量被过滤器 lower 处理后,文档大写转换文本为小写。

2. 过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:

my_list|first|upper
以上实例将第一个元素并将其转化为大写。

Note:另一种实现

django|title
3. 有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含。 例如:
bio|truncatewords:"30"
这个将显示变量 bio 的前30个词。

4.linebreaks

Replaces line breaks in plain text with appropriate HTML; a singlenewline becomes an HTML line break (<br/>) and a new linefollowed by a blank line becomes a paragraph break (</p>).

For example:

value|linebreaks
If value is Joel\nis a slug, the output will be<p>Joel<br/>is aslug</p>.

linebreaksbr

Converts all newlines in a piece of plain text to HTML line breaks(<br/>).

For example:

value|linebreaksbr
If value is Joel\nis a slug, the output will beJoel<br/>isaslug.

5. 其他过滤器:
addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。
date : 按指定的格式字符串参数格式化 date 或者 datetime 对象,实例:
pub_date|date:"F j, Y" #将变量ship_date传递给date过滤器,同时指定参数”F j,Y”。date过滤器根据参数进行格式输出。如时间的显示 April 2, 2009 是按 ‘F j, Y‘ 格式显示的。
length : 返回变量的长度。你可以对列表或者字符串,或者任何知道怎么测定长度的Python 对象使用这个方法(也就是说,有 __len__() 方法的对象)。
Note:过滤器是用管道符(|)来调用的,具体可以参见Unix管道符。

[Built-in filter reference]

[Writing custom template filters]

include 标签
该标签允许在(模板中)包含其它的模板的内容。 标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。 每当在多个模板中出现相同的代码时,就应该考虑是否要使用%include% 来减少重复。
下面这两个例子都包含了 nav.html 模板:

% include "nav.html" %
Note:

1. 和在 get_template() 中一样, 对模板的文件名进行判断时会在所调取的模板名称之前加上来自TEMPLATE_DIRS 的模板目录。

2.如果%include%标签指定的模板没找到,Django将会在下面两个处理方法中选择一个:

如果 DEBUG 设置为 True ,你将会在 Django 错误信息页面看到TemplateDoesNotExist 异常。

如果 DEBUG 设置为 False ,该标签不会引发错误信息,在标签位置不显示任何东西。

 

URL标签

url的用法也很简单,只要在urlpatterns里使用它,附加一个name,如:

url(r‘^article$‘,‘news_index‘ ,name="news_index"),
Templates里 这样使用
%url ‘name‘%
地址链接就能使用了。
Note:name是全局的,你整个urlpatterns里只能一个唯一的name,这个道理应该好理解,就像网站的地址也是唯一性的。

views里怎么用以及urlpatterns的地址包含有参数的时候<a href="%url ‘news_archive‘ 2010 02%">2010年02月</a>时可参考[Django url 标签的使用]

 

模板继承

模板可以用继承的方式来实现复用。在整个网站中,如何减少共用页面区域(比如站点导航)所引起的重复和冗余代码?

解决该问题的传统做法是使用 服务器端的 includes ,你可以在 HTML 页面中使用该指令将一个网页嵌入到另一个中。 事实上, Django 通过刚才讲述的 % include % 支持了这种方法。 但是用 Django 解决此类问题的首选方法是使用更加优雅的策略—— 模板继承 。本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。你可以将其视为服务器端 include 的逆向思维版本。 你可以对那些 不同 的代码段进行定义,而不是 共同 代码段。

第一步是定义 基础模板 , 该框架之后将由 子模板 所继承。 基础模板:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>% block title %% endblock %</title>
</head>
<body>
<h1>My helpful timestamp site</h1>
% block content %% endblock %
% block footer %
<hr>
<p>Thanks for visiting my site.</p>
% endblock %
</body>
</html>
Note:
1. 所有的 % block % 标签告诉模板引擎,子模板可以重载这些部分。每个%block%标签所要做的是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖。

2.注意由于子模板并没有定义 footer 块,模板系统将使用在父模板中定义的值。 父模板%block% 标签中的内容总是被当作一条退路。

3. 继承并不会影响到模板的上下文。 换句话说,任何处在继承树上的模板都可以访问到你传到模板中的每一个模板变量。

4. 你可以根据需要使用任意多的继承次数。

使用继承的一种常见方式是下面的三层法:

创建 base.html 模板,在其中定义站点的主要外观感受。 这些都是不常修改甚至从不修改的部分。

为网站的每个区域创建 base_SECTION.html 模板(例如,base_photos.html 和base_forum.html )。这些模板对base.html 进行拓展,并包含区域特定的风格与设计。

为每种类型的页面创建独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。

使用模板继承的一些诀窍:

如果在模板中使用 %extends% ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。

一般来说,基础模板中的 %block% 标签越多越好。记住,子模板不必定义父模板中所有的代码块,因此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越多越好。

如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 % block % 中。

如果你需要访问父模板中的块的内容,使用 block.super这个标签吧,这一个魔法变量将会表现出父模板中的内容。 如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。

不允许在同一个模板中定义多个同名的 %block% 。 存在这样的限制是因为block 标签的工作方式是双向的。 也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中出现了两个相同名称的% block % 标签,父模板将无从得知要使用哪个块的内容。

%extends% 对所传入模板名称使用的加载方法和get_template() 相同。 也就是说,会将模板名称被添加到TEMPLATE_DIRS 设置之后。

多数情况下, %extends% 的参数应该是字符串,但是如果直到运行时方能确定父模板名,这个参数也可以是个变量。 这使得你能够实现一些很酷的动态功能。

django模板语言(代码片段)

 Django模板语言官方文档链接:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for常用语法变量相关: 逻辑相关:% %变量相关语法:变量名变量名命名规范:变量名由数字、字母和下划线组成。点(.)在... 查看详情

django框架之templates(模板)系统(代码片段)

... %%变量相关的用,逻辑相关的用%%。 变量 在Django的模板语言中按此语法使用:变量名。当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。(可以理解为模板页面中先进行 查看详情

django模板语言(代码片段)

...bsp;和%%  变量相关的用,逻辑相关的用%% 变量  在Django的模板语言中按此语法使用:变量名。当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。变量  的命名包括任何字母数字以及下划线("_")的... 查看详情

django模板语言相关内容

...;}}和 {%%}变量相关的用{{}},逻辑相关的用{%%}。变量在Django的模板语言中按此语法使用:{{变量名}}。当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。变量的命名包括任何字母数字以及下划线("_")的组... 查看详情

django模板语法(代码片段)

转自:https://www.cnblogs.com/love9527/p/9077863.htmlDjango模板语法一、模板只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板。二、模板语法模板语法变量:在Django模板中遍历复杂数据结构的关键是句点字符.(其实就是... 查看详情

django框架之第三篇模板语法

Django框架之第三篇模板语法(重要!!!)一、什么是模板?只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板。二、模板语法分类一、模板语法之变量:语法为{{}}:在Django模板中遍历复杂数据结构的关键是句... 查看详情

django模板语法(代码片段)

前言:django的模板语法基本和flask的jinja2基本一样。下面比较一下两个模板语法的区别。1.模板变量django: 变量    #因为django只有一个context返回,全部数据都集中在一起jinja2: 对象.变量 2.根据列表的下标... 查看详情

django框架之第三篇模板语法(代码片段)

Django框架之第三篇模板语法(重要!!!)一、什么是模板?只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板。二、模板语法分类一、模板语法之变量:语法为:在Django模板中遍历复杂数据结构的关键是句点... 查看详情

django之模板(代码片段)

Django模板系统官方文档常用语法Django模板中只需要记两种特殊符号: 和%%表示变量,在模板渲染的时候替换成值,%%表示逻辑相关的操作。变量变量名变量名由字母数字和下划线组成。点(.)在模板语言中有特殊的含义,用... 查看详情

django框架之模板语法(重要!)(代码片段)

...板。二、模板语法分类1、模板语法之变量:语法为:在Django模板中遍历复杂数据结构的关键是句点字符 .(也就是点)views.pydefindex(request):name="hellohaiyan"i=200l=[11,22,33,44,55]d="name":"haiyan","age 查看详情

django模板语法(代码片段)

Django模板语法模板语法 变量相关%% 逻辑相关导入在view中returnrender(request,\'模板语法.html\',locals())模板的导入%include\'myform.html\'%>混合项目,能用到模板语法>前后端分离,不会用到模板语法模板的继承1.先使用block划定区域母版... 查看详情

destoon模板存放规则及语法参考

模板存放规则及语法参考一、模板存放及调用规则模板存放于系统template目录,template目录下的一个目录例如template/default/即为一套模板模板文件以.htm为扩展名,可直接存放于模板目录例如template/default/index.htm也可以存放于模板目... 查看详情

如何在静态文件中使用 django 模板语法

】如何在静态文件中使用django模板语法【英文标题】:Howtousedjangotemplatesyntaxinstaticfiles【发布时间】:2019-06-2622:54:23【问题描述】:在Django模板中包含静态文件有很多可用的文档。但是,我找不到任何关于如何在静态文件中使用D... 查看详情

django模板语法和vue语法有冲突

1.解决方案1在django1.5以后的版本,给出了解决方法,即使用标签%verbatimmyblock%%endverbatimmyblock%例如:  %verbatimmyblock%     <span>Message:msg</span>  %endverbatimmyblock%被此标签包裹的内容,django的模板引擎不会对其进行渲... 查看详情

Django 模板过滤器语法错误

】Django模板过滤器语法错误【英文标题】:DjangoTemplateFilterSyntaxerror【发布时间】:2015-08-2004:24:12【问题描述】:我正在尝试使用此代码使用django内置的“默认”过滤器%loadsekizai_tagsstaticcompressi18n%[...]<title>title|default:"nothing"<... 查看详情

django模板语法(代码片段)

目录:模板应用实例模板语法注释变量列表字典if/else标签for标签遍历列表遍历字典在%for%标签里可以通过forloop变量获取循环序号。过滤器模板语法将大写字母改小写 模板应用实例: 文件说明:#views.pyapp01的视图层函数#ur... 查看详情

django框架-django模板(template)系统(代码片段)

Django模板系统官方文档一、什么是模板?只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板。二、模板语法分类Django模板中主要有两种特殊的符号:  &  % % 表示变量,在模板渲染的时... 查看详情

django框架之第三篇模板语法(重要!!!)(代码片段)

...板。二、模板语法分类一、模板语法之变量:语法为:在Django模板中遍历复杂数据结构的关键是句点字符 .(也就是点)views.pydefindex(request):name="hellohaiyan"i=200l=[11,22,33,44,55]d="name":"haiyan","age 查看详情