• django: template


    本节介绍模板中的内置标签:if for

    承上文,修改 views.py 如下:

    from django.shortcuts import render_to_response
    
    class Person(object):
            def __init__(self, name, age, sex):
                    self.name = name
                    self.age = age
                    self.sex = sex
    
            def say(self):
                    return "This is " + self.name
    
    def index(req):
            books = {'a':'linux in a nutshell','b':'unix programming'}
            user = Person('eli', 24, 'male')
            user_list = ['eli', 'lie', 'iel']
            return render_to_response('index.html', {'title':'Django Sample', 'context':user, 'users':user_list, 'books':books})

    修改 templates/index.html 如下:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                    <title>{{title}}</title>
                    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
                    <meta name="keywords" content="Django Template" />
                    <meta name="description" content="Django Template" />
            </head>
            <body>
                    <center>{{context.name}}</center>
                    <center>{{context.say}}</center>
                    <center>
                            <li>{{users}}</li>
                            <li>{{users.0}}</li>
                    </center>
                    {% if context %}
                    <li>test if : user age {{context.age}}</li>
                    {% else %}
                    user not found.
                    {% endif %}
    
                    {% for user in users %}
                    <li>User: {{user}}</li>
                    {% endfor %}
    
                    {% for k,v in books.items %}
                    <li>{{forloop.counter}} {{k}}: {{v}}</li>
                    {% endfor %}
            </body>
    </html>

    详细用法参见官方文档:https://docs.djangoproject.com/en/1.5/ref/templates/builtins/

    2015-2-5 补充:

    include 模板标签

    {% include 'template.htm' %},在模板中载入另一个模板。

    block 模板继承

    {% extends %} {% block %}

    实际开发中,需要减少一个常见页面区域的重复和冗余(如全站导航)。解决这个问题的经典方式是使用服务器端引入和导向,可以在 HTML 里面嵌套另一个页面。上面介绍的 include 方法就是这种方案。

    模板引入能很好的解决 header 和 footer 等需求,但对于 body 内的各个块就不是很好解决。更好的解决这个问题的方法是 Django 提供的模板继承,它支持构建一个骨架模板 ,里面包含网站的通用部分,并且在里面定义好可以用子模板覆盖的块:

    <!-- 定义基本模板 base.htm -->
    
    <!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>
    <!-- index.htm -->
    
    {% extends "base.html" %}
    
    {% block title %}The current time{% endblock %}
    
    {% block content %}
    <p>It is now {{ current_date }}.</p>
    {% endblock %}

    这个方法最大化了代码重用并且很容易向公用区域添加东西,例如部分专有的导航。使用继承的常用方式是按以下三个步骤:

    1 创建 base.htm 模板来网站的整体外观,它的内容很少改变。

    2 创建 base_SECTION.htm 模板,如 base_photos.html,base_forum.html 这些模板继承 base.html 且包括部分专有的风格和设计。

    3 为每个类别的页面创建单独的模板,例如论坛页面、照片图库页面,这些模板继承相应的部分模板。


    下面是一些关于模板继承的小提示:

    1 如果在模板里使用 {% extends %},这个标签必须在所有模板标签的最前面,否则模板继承不工作
    2 通常基本模板里的 {% block %} 越多越好,子模板不必定义所有的父 block,钩子越多越好
    3 如果在很多模板里复制代码,就应该把这些代码移动到父模板里
    4 如果需要得到父模板的块内容,{{ block.super }} 变量可以完成工作,当需要给父块添加内容而不是取代它的时候这就很有用
    5 不能在同一模板里定义多个同名的 {% block %},因为块标签同时在两个地方工作,不仅仅在子模板中,而且在父模板中也填充内容,如果子模板有两个同名的标签,父模板将不能决定使用哪个块内容
    6 向 {% extends %} 传递的模板名同样会被 get_template() 使用,所以会加上 TEMPLATE_DIRS 设置
    7 大部分情况下,{% extends %} 的参数是 string,但是也可以是变量,如果直到运行时才知道父模板的名字,这可以做一些很 cool 的动态内容
  • 相关阅读:
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    Atitit.文件搜索工具 attilax 总结
    Atitit.文件搜索工具 attilax 总结
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
  • 原文地址:https://www.cnblogs.com/exclm/p/3348545.html
Copyright © 2020-2023  润新知