django学习笔记05-django 模版

前面我们的实例都是在python 代码中硬编码HTML,这样做虽然便于说明视图的工作方式,但是直接在视图中硬编码HTML不是一个好主意:

  • 只要想修改页面的设计,就需要修改Python代码。网站的设计肯定比顶层的Python代码变化频繁。因此无需修改Python代码就能改变设计,这多方便
  • 这只是十分简单的示例。网页模版往往含几百行的HTML和脚本。这样的混乱中排错和诊断程序代码简直是恶魔
  • 编写Python代码和设计HTML是两件不通的事,多数专业的WEB设计团队会把这两件事交给不通的人做。
  • 如果编写Python代码的程序员和设计模式的设计师能同时工作,而不用等到一个人编辑好包含Python和HTML的文件再交给下一个人,工作效率能得到提升。

模版系统基础

Django 模版是一些文本字符串,作用是把文档的比凹陷和数据区分开。摸吧定义一些占位符和基本的逻辑(模版标签),规定如何显示文档。通常,模版用于生成HTML,不过Django模版可以生成任何基于文本的格式。

Django模版背后的哲学:

Django的模版可不是把Python代码嵌入HTML这么简单。模版系统的设计目的是呈现比凹陷,而不是程序逻辑。

    <p>Thanks for placing an order from {{ company }}. It's scheduled to ship on {{
    ship_date|date:"F j, Y" }}.</p>
        <p>Here are the items you've ordered:</p>
        <ul>
            {% for item in item_list %}
            <li>{{ item }}</li>{% endfor %}
        </ul>
        {% if ordered_warranty %}
        <p>Your warranty information will be included in the packaging.</p>
        {% else %}
        <p>

这个模版的大部分内容是HTML,内含一些变量和模版标签,下面详细说明:

  • 两对大括号包围的文本(如{{company}})是变量,意思是“把指定变量的值插入这里”。
  • 一对花括号和百分号包围的文本(如{%for item in item_list %})是模版标签。标签的定义相当宽泛:只要能让模版系统“做些事”的就是标签。
  • 这个示例版本中有一个for标签和一个if标签。for标签的作用与python中的for 语句很想,用于迭代序列中的各个元素。与你预期的一样,if标签的作用是编写逻辑判断语句。这里,if标签检查ordered_warranty 变量的求职结果是不是True。如果是,模版系统将显示{% if ordered_warranty %} 和 {% else %} 之间的内容。如果不是,模版系统将显示{% else %} 和 {% endif %} 之间的内容。注意。{% else %} 是可选的。
  • 最后,这个模版的的第二段包含一个过滤器,这是调整变量格式最为便利的方式。对这个示例中的 {{ ship_date|date:"F j, Y" }} 来说,我们把 ship_date 变量传给 date 过滤器,并且为 date 过滤器指定 "F j, Y" 参数。date 过滤器使用参数指定的格式格式化日期。过滤器使用管道符号(|)依附,类似 于 Unix 管道。

使用模版系统:

Django系统经过配置后可以使用一个或多个模版引擎(如果不用模版,那就不用配置)。django 自带了一个内置的后段,用于支持自身的模版引擎,,即 Django Template Language(DTL)。如果没t有特别的理由更更换后端,应该使用DTL--如果编写的是可插入式应用,而且带有模版,更应该如此。Django包含模版的contrib应用,如django.contrib.admin,使用的就是DTL。

若想在python代码中使用Django的模版系统基本方式如下:

1.以字符串形式提供原始的模版代码,创建Template对象。

2。在Template对象上调用render()方法,传入一个变量(上下文)。返回的是完全渲染模版厚道得到字符串,模版中的变量和模版标签已经根据上下文求出值了。

创建 Template 对象

创建Template对象最简单的方式是直接实例化。Template 类在django.template模块中,构造方法接受一个参数,即原始的模版代码。

建的 mysite 项目目录 中输入 python manage.py shell,启动交互式解释器。

每次执行0x1045a5588 部分都不相同。这个是Template对象的“标识”

创建 Template 对象时,模板系统会把原始的模板代码编译成内部使用的优化形式,为渲染做好准备。但是,

如果模板代码中有句法错误,调用 Template() 会导致 TemplateSyntaxError 异常抛出:

Django 解析模版的速度相当快。在背后,解析的大部分工作通过调用一个正则表达式完成。这与基于XML的模版系统有显著区别,xml解析器会带来额外的消耗,从而导致渲染速度比Django的模版渲染引擎满几个数量级。

遇到下述各种情况是,模版系统会抛出TemplateSyntaxError:

  • 无效标签
  • 有效标签的无效参数
  • 无效过滤其
  • 有效过滤器的无效参数
  • 无效模块句法
  • 未关闭的标签(对需要结束标签的模版标签而言)

渲染模板

有了Template对象之后,可以未其提供上下文,把数据传给它。上下文就是一系列模版变量和响应的值。模版使用上下文填充变量,求值标签。在Django中,上下文使用django.template 模块中的Context类表示。它的构造方法接受一个可选参数:一个字典,把变量映射到值上。“填充”模版的方式是,在Template对象上调用render()方法,并传入上下文。

一个特殊的Python提示符:

如果你用过Python,可能会想,为什么运行python manage.py shell而不是python。这两个命令都能启动交互式解释器,但是manage.py shell 命令有个关键区别:在启动解释器之前,告诉Django 使用哪个设置文件。Django 的很多部分,包括模版系统,依赖于设置,如果不告诉Django 使用哪个设置,你就无法使用它们。如果你好奇,其后的原理 是Django产生一个名为DJANGO_SETINGS_MODULE的环境变量,其值是导入settings.py的路径。例如:DJANGO_SETINGS_MODULE的值可能是'mysite.settings'.

字典和上下文:

python字典是健和值的映射。Context对象类似于字典,但是它有额外的功能,

变量名必须以字母开头(A-Z或a-z)后面可以跟这任意多个字母、、下划线和点号。变量名区分大小写。

模版中我们可以使用点号引用对象的方法。例如,每个python字符串都有upper()和isdigit()方法,在Django模版中可以使用点号句法调用它们:

from django.template import Template, Context
    >>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
    >>> t.render(Context({'var': 'hello'}))
    'hello -- HELLO -- False'
    >>> t.render(Context({'var': '123'}))
    '123 -- 123 -- True'

注意:方法调用中没有括号,此外,不能给方法传递变量,只能调用无需参数的方法。最后,还可以使用点号访问列表索引。

from django.template import Template, Context
    >>> t = Template('Item 2 is {{ items.2 }}.')
    >>> c = Context({'items': ['apples', 'bananas',
    'carrots']})
    >>> t.render(c)
    'Item 2 is carrots.'

不允许使用负数索引。例如,模板变量 {{ items.-1 }} 会导致 TemplateSyntaxError 抛出。

提醒一下,python列表的索引从零开始。第一个元素的索引是0,第二个元素的索引是1,以此类推。

上下文变量查找:

模版系统能优雅处理很多复杂的数据结构,比如列表、字典和自定义的对象。遍历Django的模版中复杂数据结构的关键是点号(.)

类似地,通过点号还可以访问对象属性。在Django模版中可以使用点号昂问这些属性:

同理我们可以通过点号来访问类的属性,而且通过点号引用对象的方法。

不循序使用负数索引。例如,模版变量{{items.-1}}会导致TemplateSyntaxError抛出。

python列表:

提醒一下,Python列表的索引从零开始,第一个元素的索引是0 ,第二个元素索引是1,以此类推。

总结起来,模版系统遇到变量名中的点号时湖按照下述顺序尝试查找:

  • 字典查找(如foo['bar'])
  • 属性查找(如foo.bar)
  • 方法查找(如foo.bar())
  • 列表索引查找(如foo[2])

模版系统将将使用第一个可用的类型

方法调用的行为:

方法调用与其他集中查找稍微复杂一些。下面要知道的几件事:

  • 在方法查找的过程中,如果

猜你喜欢

转载自blog.csdn.net/qq_34608423/article/details/89352121
今日推荐