• Django基础(三)


    Template

    不能直接将html硬编码到视图里的原因:

    • 对页面设计进行的任何改变都必须对python 代码进行相应的修改。站点设计的修改往往比底层python 代码的修改要频繁的多,因此如果可以在不进行python代码修改的情况下变更设计,将会方便很多
    • python代码编写和HTML设计是两个不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员来完成,设置者和HTML/CSS的编码人员都不应该被要求去编辑python的代码来完成他们的工作
    • 程序员编写python代码和设计人员制作模板两个工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个即包含python有包含HTML的文件进行编辑工作

    Django 模板基本语法

    >>> from django.template import Context, Template
    >>> t = Template('My name is {{ name }}.')
    >>> c = Context({'name': 'Stephane'})
    >>> t.render(c)
    u'My name is Stephane.'
    # {{ }} 内表示变量

    一旦有了模板对象,就可以通过它渲染多个context

    >>> from django.template import Template, Context
    >>> t = Template('Hello, {{ name }}')
    >>> print t.render(Context({'name': 'John'}))
    Hello, John
    >>> print t.render(Context({'name': 'Julie'}))
    Hello, Julie
    >>> print t.render(Context({'name': 'Pat'}))
    Hello, Pat

    无论何时我们都可以想这样使用同一个模板渲染多个context,只进行一次模板创建后多次调用render()方法效率会更高:

    # Bad
    for name in ('John', 'Julie', 'Pat'):
        t = Template('Hello, {{ name }}')
        print t.render(Context({'name': name}))
     
    # Good
    t = Template('Hello, {{ name }}')
    for name in ('John', 'Julie', 'Pat'):
        print t.render(Context({'name': name}))

    深度变量的查找

    在Django 模板中遍历复杂数据结构的关键是 点字符(.)

    假设要向模板传递一个python字典要通过字典键访问该字典的值,可使用一个句点

    >>> from django.template import Template, Context
    >>> person = {'name': 'Sally', 'age': '43'}
    >>> t = Template('{{ person.name }} is {{ person.age }} years old.')
    >>> c = Context({'person': person})
    >>> t.render(c)
    u'Sally is 43 years old.'

    同样,也可以通过句点来访问对象的属性

    不如python 的datatime.data对象有year,month和day几个属性,同样可以在模板中使用句点来访问这些属性

    >>> from django.template import Template, Context
    >>> import datetime
    >>> d = datetime.date(1993, 5, 2)
    >>> d.year
    1993
    >>> d.month
    5
    >>> d.day
    2
    >>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
    >>> c = Context({'date': d})
    >>> t.render(c)
    u'The month is 5 and the year is 1993.'

    这个例子使用了一个自定义的类,演示了通过实例变量加一点(dots)来访问它的属性,这个方法适用于任意的对象

    >>> from django.template import Template, Context
    >>> class Person(object):
    ...     def __init__(self, first_name, last_name):
    ...         self.first_name, self.last_name = first_name, last_name
    >>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
    >>> c = Context({'person': Person('John', 'Smith')})
    >>> t.render(c)
    u'Hello, John Smith.'

    点语法也可以用来引用对象的 方法。

    例如:每个python 字符串都有upper()和isdigit()方法,可以在模板中使用同样的句点语法来调用它们:

    >>> from django.template import Template, Context
    >>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
    >>> t.render(Context({'var': 'hello'}))
    u'hello -- HELLO -- False'
    >>> t.render(Context({'var': '123'}))
    u'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)
    u'Item 2 is carrots.'

    include 模板标签

    {% include %} 内建模板标签,该标签允许在(模板中)包含其它的模板的内容。标签的参数是所要包含的模版名称,可以是一个变量,也可以是用引号硬编码的字符串。

    在模板中 双引号和单引号是等价的。

    模板继承

    可以在HTML页面中使用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>

    {% block xxx %} {% endblock %} 内部为子模板可变内容(非继承),xxx名字可以随便,但是子模板必须使用这个名字进行自定义的改变。

    第二步,在子模板中引用

    {% extends "base.html" %}    # extends 为继承关键字 ,后面为所需要基础的父模板名
     
    {% block title %}The current time{% endblock %}    #可自定义内容
     
    {% block content %}
    <p>It is now {{ current_date }}.</p>
    {% endblock %}

    这种方法可以进行传递,即孙可以继承子模板的也可以继承父模板的。

    使用模板常见的三层法:

    • 创建base.html 模板,在其中定义站点的主要外观感受。这些部分是不经常修改甚至从不修改
    • 为站点的每个区域创建base_SECTION.html 模板,这些模板对base.html 进行拓展,并包含区域特定的风格于设计
    • 为每种类型的页面创建独立的模板,这些模板拓展相应的区域模板

    使用模板的诀窍:

    • 如果在模板中使用{% exteends %},必须保证其为模板中的第一个模板标记,否则,模板继承将不起作用
    • 一般来说,基本模板中的{% block %}标签越到越好,子模板必须定义父模板中所有的代码块,因此可以用合理的缺省值对一些代码进行填充,然后只对子模板所需的块代码进重定义,
    • 如果发觉有多个模板之间拷贝代码,就应该考虑将该代码放置到父模板的某个{% block %}中
    • 如果需要访问父模板中的块的内容,使用{% block.supeer %} 这个标签,这个魔法变量将会表现出父模板中的内容。如果只想在上级代码块基础上添加内容,而不是全部重载,就使用这个变量
    • 不允许在同一个模板中定义多个同名的{% block %}。存在这样的限制是因为block标签的工作方式是双向的。
  • 相关阅读:
    为什么不应该使用ZooKeeper做服务发现
    Python 练习 人事管理
    Python 爬取 妹子图(技术是无罪的)
    Python 爬取 书籍
    Python 爬取 豆瓣
    Python 爬取 房天下
    Python 爬取 煎蛋
    Python 爬取 拉钩
    Python 爬取 猫眼
    家具专区网
  • 原文地址:https://www.cnblogs.com/binges/p/5516328.html
Copyright © 2020-2023  润新知