Django之 模板

模板的应用原理、过程

以mysite项目为例:

当一个url开始匹配开始时,先去mysite/mysite/urls.py 里匹配,然后里面会具体匹配到哪个应用,调用相应应用下的urls.py,(例如这里是polls)-> mysite/mysite/polls/urls.py 里面匹配到相应的url后,会调用polls应用下views.py里相应的函数 -> mysite/mysite/polls/views.py 最后使用render或render_to_response输出相应的模板 ->  mysite/mysite/polls/templates/polls/template.html

如果这个模板还通过include引用了其他页面,或继承于其他模板页面,会继续加载相应的页面或模板

模板的配置方法

先在项目/setting.py下配置添加模板路径

setting.py内TEMPLATES 设置中添加一个DIRS 选项 :

‘DIRS‘: [os.path.join(BASE_DIR, ‘templates‘)],

其中BASE_DIR =os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

然后再在相应应用下面建立模板目录,放置模板文件,最终结构是templates/应用名称(例如polls)/模板文件(index.html等) ,使用时系统会自动查找templates目录,注意是templates目录,要自行加上plls路径,不然会找不到文件

模板中的注释

l  单行:{# This is acomment #}

l  多行:要使用标签了

{% comment %}

This is a

multi‐line comment.

{% endcomment %}

过滤器

模板过滤器是在变量被显示前修改它的值的一个简单方法。过滤器使用管道字符。

例1:小写转换

{{ name|lower }}

显示的内容是变量 {{ name }} 被过滤器 lower 处理后的结果,它功能是转换文本为小写。

例2:日期格式化显示

{{ pub_date|date:"F j, Y" }}

例3:

{{ bio|truncatewords:"30" }}

这个将显示变量 bio 的前30个词。

基本的模板标签

1、include标签

内建模板标签: {% include %} 。该标签允许在

(模板中)包含其它的模板的内容。标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引

号硬编码的字符串。 每当在多个模板中出现相同的代码时,就应该考虑是否要使用 {% include %} 来减少重

复。

例:

{% include ‘polls/foot.html’%}

2、if/else标签

标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会

显示在 {% if %} 和 {% endif %} 之间的任何内容

例:

{% if today_is_weekend %}

<p>Welcome to the weekend!</p>

{% endif %}

{% else %} 标签是可选的:

{% if today_is_weekend %}

<p>Welcome to the weekend!</p>

{% else %}

<p>Get back to work.</p>

{% endif %}

注意:

1、在Python和Django模板系统中,以下这些对象相当于布尔值的False,其余的都是True

l  空列表([] )

l  空元组(() )

l  空字典({} )

l  空字符串(‘‘ )

l  零值(0 )

l  特殊对象None

l  对象False(很明显)

2、{% if %} 标签不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的

例:{% ifathlete_list and coach_list or cheerleader_list %}  这是错误的

3、系统不支持用圆括号来组合比较操作。如果你确实需要用到圆括号来组合表达你的逻辑式,考虑将它移到模板

之外处理,然后以模板变量的形式传入结果吧。或者,仅仅用嵌套的{% if %}标签替换吧,就像这样:

{% if athlete_list %}

{% if coach_list orcheerleader_list %}

We have athletes,and either coaches or cheerleaders!

{      % endif %}

{% endif %}

4、多次使用同一个逻辑操作符是没有问题的,但是我们不能把不同的操作符组合起来。例如,这是合法的:

{% if athlete_list or coach_list or parent_list or teacher_list %}

5、没有 {% elif %} 标签,并且一定要用 {% endif %} 关闭每一个 {% if %} 标签。

3、for标签

{%for %} 允许我们在一个序列上迭代。 与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭

代的序列而X是在每一个特定的循环中使用的变量名称。 每一次循环中,模板系统会渲染在 {% for%} 和

{%endfor %} 之间的所有内容。

例:

{% for athlete in athlete_list %}

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

{% endfor %}

在执行循环之前先检测列表的大小是一个通常的做法,当列表为空时输出一些特别的提示。

{%if athlete_list %}

{% for athlete in athlete_list %}

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

{% endfor %}

{%else %}

<p>There are no athletes. Onlycomputer programmers.</p>

{%endif %}

for标签里有很多变量,方便我们的使用。在每个``{% for %}``循环里有一个称为`` forloop`` 的模板变量。这个变量有一些提示循环进度信息的属性。

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

次循环时forloop.counter 将会被设置为1。

例:结果会显示1 2 3

y=[1,2,3]

{% for x in y %}

{{ forloop.counter }}

{% endfor %}

l  forloop.counter0 类似于 forloop.counter ,但是它是从0计数的。第一次执行循环时这个变量会被设置

为0。

l  forloop.revcounter 是表示循环中剩余项的整型变量。在循环初次执行时 forloop.revcounter 将被设置

为序列中项的总数。最后一次循环执行中,这个变量将被置1。

l  forloop.revcounter0 类似于 forloop.revcounter,但它以0做为结束索引。在第一次执行循环时,该变

量会被置为序列的项的个数减1。

l  forloop.first 是一个布尔值,如果该迭代是第一次执行,那么它被置为````

l  forloop.last 是一个布尔值;在最后一次执行循环时被置为True

l  forloop.parentloop 是一个指向当前循环的上一级循环的forloop对象的引用(在嵌套循环的情况下)。

例:

{% for country incountries %}

<table>

{% for city incountry.city_list %}

<tr>

<td>Country #{{forloop.parentloop.counter }}</td>

<td>City #{{forloop.counter }}</td>

<td>{{ city}}</td>

</tr>

{% endfor %}

</table>

{% endfor %}

注意:

l  Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。

l  forloop 变量仅仅能够在循环中使用。 在模板解析器碰到{% endfor %}标签后,forloop就不可访问了

4、ifequal/ifnotequal标签

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

例:比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}

<h1>Welcome!</h1>

{% endifequal %}

参数可以是硬编码的字符串,随便用单引号或者双引号引起来,所以下列代码都是正确的:

{% ifequal section ‘sitenews‘ %}

<h1>SiteNews</h1>

{% endifequal %}

和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:

{% ifequal section ‘sitenews‘ %}

<h1>Site News</h1>

{% else %}

<h1>No NewsHere</h1>

{% endifequal %}

注意:

l  只有模板变量,字符串,整数和小数可以作为 {% ifequal %} 标签的参数。下面是合法参数的例子:

{% ifequal variable 1 %}

{% ifequal variable 1.23 %}

{% ifequal variable ‘foo‘ %}

{% ifequal variable"foo" %}

l  其他任何类型,例如Python的字典类型、列表类型、布尔类型,不能用在 {% ifequal %} 中。 下面是些错误的

例:

{% ifequal variable True %}

{% ifequal variable [1, 2, 3]%}

{% ifequal variable {‘key‘:‘value‘} %}

l  如果你需要判断变量是真还是假,请使用 {% if %} 来替代 {% ifequal %}

模板继承

为了减少开发中代码的书写,除了使用{% include %}共用的代码,更好的方法就是模板继承

模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。

使用方法:第一步是定义继承模板,一个基本的html页面,页面中{% block blockname %} 内容 {% endblock %} 里的内容就是可以重载、添加或保留的那些块。当一个页面继承了所定义的模板,它可以选择自定义{% block blockname %} {% endblock %}之间的内容,如果不去改变就会沿用原有设置

例(在视图中使用模板):

1、先定义一个模板base.html

<!DOCTYPEHTML PUBLIC "‐//W3C//DTD HTML 4.01//EN">

<html>

<head>

<title>{%block title %}标题内容{% endblock %}</title>

</head>

<body>

{%block content %}内容<h1>My helpful timestamp site</h1>{% endblock %}

{%block footer %}

<hr>

<p>Thanksfor visiting my site.页脚</p>

{%endblock %}

</body>

</html>

2、然后在extends.html页面中继承base.html

{%extends "polls/base.html" %}        #这里的路径要注意!django只会查找每个应用的templates根目录,再下一层的目录要手动写上去

{%block title %} dx site {% endblock %}

{%block content %} <h2> dx content </h2> {% endblock %}

3、然后在polls应用下的view.py 定义一个用于测试继承的函数

defextends_test(request):

returnrender_to_response(‘polls/extends.html‘)

4、再在polls应用下的url.py定义一个新的url匹配规则

#ex: /polls/extends/

url(r‘extends/$‘, views.extends_test,name=‘extends_test‘),

至此,模板的继承应用就实现了

注意:

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

用。

l  {% extends %} 对所传入模板名称使用的加载方法和 get_template() 相同。 也就是说,会将模板名称被添

加到 TEMPLATE_DIRS 设置之后。

l  多数情况下, {%extends %} 的参数应该是字符串,但是如果直到运行时方能确定父模板名,这个参数也

可以是个变量。 这使得你能够实现一些很酷的动态功能

其他技巧

当我们利用render或render_to_response调用模板输出的时候,可以利用locals()传入所有的局部变量到模板里,这样就可以偷懒写一个locals()就可以了。

时间: 2024-10-12 21:19:33

Django之 模板的相关文章

Django的模板系统

模板系统介绍 模板系统的组成:HTML代码和逻辑控制代码 逻辑控制代码可以理解是django模板语言 django的模板语言组成 变量(使用双大括号来引用变量): 标签(tag)的使用(使用大括号和百分比的组合来表示使用tag) 模板继承 模板语言之变量 语法: {{var_name}} var_name 指变量名 使用模板语言之前: 先介绍template对象和Context对象 进入django的项目的交互环境 python manange.py shell >>> from dja

第四章:Django 的模板系统(转)

在之前的章节中,你可能觉得例子中视图返回文本有点不妥.即是, HTML 是直接写在 Python 代码中的. 这种做法会导致这些问题: 要做任何设计上的更改就必须改写 Python 代码.网站的设计风格的更变一般来说会比更改后台的 Ptyhon 代码来得频繁,因此如果能够更改设计而不用更改 Python 变得尤为方便. 2 Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成.设计人员和 HTML/CSS 编写人员都不应

Django使用模板进行动态局部刷新

想学习python,但是找不到方向,最近想突然对web编程感兴趣了,所有一直在看,刚刚对着教程做了一点东西. 使用Django提交评论时,如果使用Form提交评论信息,那么提交成功后,最好是能把刚刚输入的评论信息显示出来: 所以提交评论信息后,最好能马上将评论内容显示出来. 当时考虑了3种方法: 1.最开始考虑使用Ajax+json,从服务器读取最新的一条评论信息,当多个用户同时提交评论的时候,这种办法会出现不同步的现象,pass掉: 2.还是使用Ajax+json,客户端传递当前页面的评论数量

Django 自定义模板标签和过滤器

1.创建一个模板库 使用模板过滤器的时候,直接把过滤器写在app里,例如:在app里新建一个templatetags的文件夹,这个目录应当和 models.py . views.py 等处于同一层次.例如: books/     __init__.py     models.py     templatetags/     views.py 在 templatetags 中创建两个空文件:一个 __init__.py (告诉Python这是一个包含了Python代码的包)和一个用来存放你自定义的

实习生的Django[2](模板)

快要下班了,今天研究了一整天日文翻译(我的项目与日文息息相关阿),累得要死,在下班之前偷偷总结一下今天学的Django. 因为不能花很多时间去学Django,要均衡-所以今天就之做了一下模板. 因为上一次写的[1]说的视图,今天很自然就开始作模板了. 什么叫模板? 玩过C++的人都知道(c++三宝:template,stl,class),但是为了博文看起来好像作者有在写,我就用简单地话解释一下:我们面试都非常讨厌自我介绍(好像面试官不会看简历的样子?),为此我只能将:我叫XXX,来自XXX,特长

python django -4 模板

模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用 模板包含 HTML的静态部分 动态插入内容部分 Django模板语言,简写DTL,定义在django.template包中 由startproject命令生成的settings.py定义关于模板的值: DIRS定义了一个目录列表,模板引擎按列表顺序

Django中模板总结[模板语言,模板继承,CSRF攻击,反向解析]

模板 概述 作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器.模版致力于表达外观,而不是程序逻辑.模板的设计实现了业务逻辑view与显示内容template的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用. 创建模板文件夹 在项目的文件里面定义一个templates文件夹 在创建的文件夹里面再创建一个文件夹为每个应用的html文件夹 起名为和应用名同名的文

django 自定义模板过滤器

参考:http://www.cnblogs.com/qwj-sysu/p/4246605.html 做的页面,一个tr里有两个td, 1.3.5等奇数数据要放在第一个td, 2.4.6等偶数数据要放在第二个td, (如果已经没有数据,td 内容要为空), 所以要根据取余数的结果来判断; 但django的模板没有取余操作,只好自定义一个 django的模板配置在:setting.py TEMPLATES = [ { 'BACKEND': 'django.template.backends.djan

Django之模板层

前面学习了Django的下载和基础的操作,掌握了其基本框架,接下来我们来学习Django中的模板语法. 学习任务:知道什么是模板,以及html+模板语法的具体用法 python的模板:HTML代码+模板语法 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的标签. #原始的视图 def timeHandle(request): import datetime t=datetime.datetime.now() #Django修改后的视图 # 方式1: # return HttpRespons

[Django学习]模板

模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用 模板包含 HTML的静态部分 动态插入内容部分 Django模板语言,简写DTL,定义在django.template包中 由startproject命令生成的settings.py定义关于模板的值: DIRS定义了一个目录列表,模板引擎按列表顺序