zoukankan      html  css  js  c++  java
  • 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 的动态内容
  • 相关阅读:
    java中的访问控制符
    DDD CQRS和Event Sourcing的案例:足球比赛
    你用过Spring中哪些功能?
    基于角色的权限访问控制初步
    mybatis深入学习
    GNU make学习笔记
    XmlFactoryBean和DefaultListableBeanFactory学习
    重新组织函数
    【JRebel 作者出品--译文】Java class 热更新:关于对象,类,类加载器
    不吹不黑,关于 Java 类加载器的这一点,市面上没有任何一本图书讲到
  • 原文地址:https://www.cnblogs.com/exclm/p/3348545.html
Copyright © 2011-2022 走看看