zoukankan      html  css  js  c++  java
  • python学习笔记--Django入门二 Django 的模板系统

    为了使网站更干净简洁更容易维护,页面的设计和Python的代码必须分离开。我们可以使用Django的 模板系统 (Template System)来实现这种模式。

    几个简单的模板标签(tag):

       for 标签 {% for item in item_list %}   用于构建简单的循环,允许你遍历循环中的每一项

       if 标签 {% if ordered_warranty %}  是用来执行逻辑判断的。在这个例子中标签检测 ordered_warranty 变量值是否为 True 。如果是,模板系统将显示 {% if ordered_warranty %} 与 {% endif %} 之间的所有内容

         filter 过滤器  它能让你用来转换变量的输出, 在这个例子中, {{ship_date|date:"F j, Y" }} 将变量 ship_date 用 date 过滤器来转换,转换的参数是 "F j, Y" . date 过滤器根据指定的参数进行格式输出。过滤器是用管道字符( | )来调用的,就和Unix管道一样

    模板渲染

     

    一旦你创建一个 Template 对象,你可以用 context 来传递数据给它。一个context是一系列变量和它们值的集合。模板使用它来赋值模板变量标签和执行块标签。

    context在Django里表现为 Context 类,在 django.template 模块里。 它的构造函数有一个可选参数:一个字典(映射变量和它们的值)。调用 Template 对象 的 render() 方法并传递context来填充模板:

    >>> from django.template import Context, Template
    >>> t = Template("My name is {{ name }}.")
    >>> c = Context({"name": "Stephane"})
    >>> t.render(c)
    'My name is Stephane.'

    在视图中使用模板

    模板加载

    需要指定模板保存的位置并用 Python 内建的文件操作函数来读取文件内容,使用使用 模板加载 来做这个事情。Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板,要使用此模板加载API,首先你必须将模板的保存位置告诉框架。该项工作在 设置文件 中完成。

    目前而言,仅需关注 TEMPLATE_DIRS 设置。该设置告诉 Django 的模板加载机制在哪里查找模板。缺省情况下,该设置的值是一个空的元组。选择一个目录用于存放模板并将其添加到 TEMPLATE_DIRS 中:

    TEMPLATE_DIRS = (
        '/home/django/mysite/templates',
    )

    不要忘记模板目录字符串尾部的逗号!Python 要求单元素元组中必须使用逗号,以此消除与圆括号表达式之间的歧义。这是新手常犯的错误。

    更灵活一点并减少一些负面干扰,可利用 Django 配置文件就是 Python 代码这一点来动态构建 TEMPLATE_DIRS 的内容,如:

    import os.path
    
    TEMPLATE_DIRS = (
        os.path.join(os.path.dirname(__file__), 'templates').replace('\','/'),
    )

     Python 内部变量 __file__ ,该变量被自动设置为代码所在的 Python 模块文件名。

    下一步:修改视图代码 views.py

    from django.template.loader import get_template
    from django.template import Context
    from django.http import HttpResponse
    import datetime
    
    def current_datetime(request):
        now = datetime.datetime.now()
        t = get_template('current_datetime.html')
        html = t.render(Context({'current_date': now}))
        return HttpResponse(html)

    使用了函数 django.template.loader.get_template() ,而不是手动从文件系统加载模板。该 get_template()函数以模板名称为参数,在文件系统中找出模块的位置,打开文件并返回一个编译好的 Template 对象。

    接下来,在模板目录中创建包括以下模板代码 current_datetime.html 文件:

    <html><body>It is now {{ current_date }}.</body></html>

    在网页浏览器中刷新该页,你将会看到完整解析后的页面

    render_to_response()

    由于加载模板、填充 context 、将经解析的模板结果返回为 HttpResponse 对象这一系列操作实在太常用了,Django 提供了一条仅用一行代码就完成所有这些工作的捷径。该捷径就是位于 django.shortcuts 模块中名为 render_to_response() 的函数。大多数时候,你将使用 render_to_response() ,而不是手动加载模板、创建 Context 和 HttpResponse 对象。

    下面就是使用 render_to_response() 重新编写过的 current_datetime 范例。

    from django.shortcuts import render_to_response
    import datetime
    
    def current_datetime(request):
        now = datetime.datetime.now()
        return render_to_response('current_datetime.html', {'current_date': now})

    render_to_response() 的第一个参数必须是要使用的模板名称。如果要给定第二个参数,那么该参数必须是为该模板创建 Context 时所使用的字典。如果不提供第二个参数, render_to_response() 使用一个空字典。

    include 模板标签

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

    模板继承

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

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

    <!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 %} 标签告诉模板引擎,子模板可以重载这些部分。

     现在修改前边的current_datetime.html ,让它来继承模板

    {% extends "base.html" %}
    
    {% block title %}The current time{% endblock %}
    
    {% block content %}
    <p>It is now {{ current_date }}.</p>
    {% endblock %}

    再为 hours_ahead 视图创建一个模板

    {% extends "base.html" %}
    
    {% block title %}Future time{% endblock %}
    
    {% block content %}
    <p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p>
    {% endblock %}

     {% extends %} 标签, 表示该模板是一个子模板。模板引擎立即装载其父模板,即本例中的 base.html 。

     这个方法可最大限度地重用代码,并使得向公共区域(如区域级的导航)添加内容成为一件轻松的工作。
     
    如果需要获得父模板中代码块的内容,可以使用 {{ block.super }} 变量。如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。
     
     
  • 相关阅读:
    YOLOv5目标检测源码重磅发布了!
    CSS文本
    CSS3:透明度
    CSS3:HSL和HSLA
    颜色-背景色
    颜色-前景色
    列表 图像 链接
    CSS简介
    标记和插入音频视频
    表单
  • 原文地址:https://www.cnblogs.com/taiguyiba/p/6055306.html
Copyright © 2011-2022 走看看