• python之django母板页面


    其实就是利用{% block xxx %}   {% endblock %}的方式定义一个块,相当于占位。存放在某个html中,比如base.html

    然后在需要实现这些块的文件中,使用继承{% extends "base.html" %}的方式引入母板文件,然后在{% block xxx %}......{% endblock %}块定义中实现具体的内容。

    base.html示例:注意块的定义。

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
        <meta name="description" content="">
        <meta name="author" content="">
        <link rel="icon" href="http://v3.bootcss.com/favicon.ico">
        <link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css">
        <title>所有的书都在这里</title>
        {% block page_css %}
        {% endblock %}
        {% block page_js %}
        {% endblock %}
    
        <!-- Bootstrap core CSS -->
        <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    
        <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
        <link href="http://v3.bootcss.com/assets/css/ie10-viewport-bug-workaround.css" rel="stylesheet">
    
        <!-- Custom styles for this template -->
        <link href="http://v3.bootcss.com/examples/dashboard/dashboard.css" rel="stylesheet">
    
        <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
        <!--[if lt IE 9]><script src="http://v3.bootcss.com/assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
        <script src="http://v3.bootcss.com/assets/js/ie-emulation-modes-warning.js"></script>
    
        <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
        <!--[if lt IE 9]>
          <script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
          <script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
        <![endif]-->
    </head>
    
    <body>
    
    {% include "nav.html" %}
    
    <div class="container-fluid">
        <div class="row">
            <div class="col-sm-3 col-md-2 sidebar">
                <ul class="nav nav-sidebar">
                    <li class="{% block book_class %}{% endblock %}"><a href="/book_list/">所有的书 <span class="sr-only">(current)</span></a>
                    </li>
                    <li class="{% block publisher_class %}{% endblock %}"><a href="/publisher_list/">出版社</a></li>
                    <li class="{% block author_class %}{% endblock %}"><a href="/author_list/">作者</a></li>
    
                </ul>
            </div>
            <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">            
                {% block main_body %}
                    {#这里是每个页面不同的部分#}
                {% endblock %}
            </div>
        </div>
    </div>
    
    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="http://v3.bootcss.com/assets/js/vendor/jquery.min.js"></script>')</script>
    <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <!-- Just to make our placeholder images work. Don't actually copy the next line! -->
    <script src="http://v3.bootcss.com/assets/js/vendor/holder.min.js"></script>
    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="http://v3.bootcss.com/assets/js/ie10-viewport-bug-workaround.js"></script>
    </body>
    </html>

    某个继承页:

    {# 继承母板 #}
    {% extends 'base.html' %}
    
    {% block book_class %}
        active
    {% endblock %}
    {% block page_css %}
        {% load static %}
        <link rel="stylesheet" href="{% get_static_prefix %}book_list_only.css">
    {% endblock %}
    
    {#把自己页面的内容,填入母板里面相应的位置#}
    {% block main_body %}
        <div class="panel panel-primary">
                    <div class="panel-heading">
                        <h3 class="panel-title">我是自定义内容,用来替换母板中指定的位置</h3>
                    </div>
                    <div class="panel-body">
                        <div class="row">
                            <div class="col-md-8"> </div>
                            <div class="col-md-4"><a href="/add_book/" class="btn btn-primary"><i class="fa fa-plus-square"></i> 添加新书</a>
                                <a href="/add_publisher/" class="btn btn-success"><i class="fa fa-plus-square"></i> 添加出版社</a></div>
                        </div>
    
    
                        <table class="table table-dark table-hover">
                            <thead>
                            <tr>
                                <th>#</th>
                                <th>id</th>
                                <th>名称</th>
                                <th>出版社</th>
                                <th>操作</th>
                            </tr>
                            </thead>
                            <tbody>
                            {% for b in books %}
                                <tr>
                                    <td>{{ forloop.counter }}</td>
                                    <td>{{ b.id }}</td>
                                    <td>{{ b.title }}</td>
                                    <td>{{ b.publisher.name }}</td>
                                    <td>
                                        <a href="/del_book/?id={{ b.id }}" class="btn btn-danger"><i class="fa fa-trash fa-fw"></i>删除</a>
                                        <a href="/edit_book/?id={{ b.id }}" class="btn btn-info"><i class="fa fa-pencil fa-fw"></i>编辑</a>
                                    </td>
                                </tr>
                            {% endfor %}
                            </tbody>
                        </table>
    
                    </div>
                </div>
    {% endblock %}

    另一个继承页:

    {% extends "base.html" %}
    {% block main_body %}
                <div class="panel panel-primary">
                    <div class="panel-heading">
                        <h3 class="panel-title">所有的出版社</h3>
                    </div>
                    <div class="panel-body">
                        <div class="row">
                            <div class="col-md-8"> </div>
                            <div class="col-md-4"><a href="/add_book/" class="btn btn-primary"><i class="fa fa-plus-circle fa-fw"></i>添加新书</a>
                                <a href="/add_publisher/" class="btn btn-success"><i class="fa fa-plus-circle fa-fw"></i>添加出版社</a></div>
                        </div>
    
    
                        <table class="table table-dark table-hover">
                            <thead>
                            <tr>
                                <th>#</th>
                                <th>id</th>
                                <th>名称</th>
                                <th>地址</th>
                                <th>操作</th>
                            </tr>
                            </thead>
                            <tbody>
                            {% for p in publisher %}
                                <tr>
                                    <td>{{ forloop.counter }}</td>
                                    <td>{{ p.id }}</td>
                                    <td>{{ p.name }}</td>
                                    <td>{{ p.addr }}</td>
                                    <td>
                                        <a href="/del_publisher/?id={{ p.id }}" class="btn btn-danger"><i class="fa fa-remove fa-fw"></i>删除</a>
                                        <a href="/edit_publisher/?id={{ p.id }}" class="btn btn-info"><i class="fa fa-edit fa-fw"></i>编辑</a>
                                    </td>
                                </tr>
                            {% endfor %}
                            </tbody>
                        </table>
    
                    </div>
                </div>
      {% endblock %}
    {% block publisher_class %}
        active
    {% endblock %}

    完整的练习项目代码。

    1. 母版和继承
    1. 什么时候用母版?
    html页面有重复的代码,把它们提取出来放到一个单独的html文件。
    (比如:导航条和左侧菜单)
    2. 子页面如何使用母版?
    {% extends 'base.html' %} --> 必须要放在子页面的第一行

    母版里面定义block(块),子页面使用block(块)去替换母版中同名的块
    2. 组件
    1. 什么时候用组件?
    重复的代码,包装成一个独立的小html文件。
    2. 如何使用?
    {% include 'nav.html' %}

    3. Django模板语言中关于静态文件路径的灵活写法
    1. 利用Django模板语言内置的static方法帮我拼接静态文件的路径
    {% load static %}
    <link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">
    2. 利用内置的get_static_prefix获取静态文件路径的别名,我们自行拼接路径
    {% load static %}
    <link href="{% get_static_prefix %}bootstrap/css/bootstrap.min.css" rel=stylesheet>
    3. as语法(一个路径多次用到,可以使用as保存到一个变量,后面就直接使用变量代替具体路径)
    4. 自定义的simple_tag
    比filter高级一点点
    它可以接受的参数个数大于2

    5. 自定义的inclusion_tag
    用来返回一段html代码(示例:返回ul标签)

    1. 定义阶段
    在app下面新建templatetags 文件夹(注意是Python包)
    新建一个py文件

    from django import template
    # 生成注册示例,名字必须是register
    register = template.Library()
    @register.inclusion_tag("ul.html")
    def show_ul(num):
    num = 1 if num < 1 else int(num)
    data = ["第{:0>3}个数字".format(i) for i in range(1, num+1)]
    return {"data": data}

    2. 调用阶段
    {% load xx %}
    {% show_ul 10 %}

  • 相关阅读:
    原型模式
    Object.defineProperties()和Object.defineProperty()方法
    访问器属性:setter()函数和getter()函数
    2019.7.11刷题统计
    2019.7.10刷题统计
    2019.7.9刷题统计
    2019.7.8刷题统计
    2019.7.7刷题统计
    2019.7.6刷题统计
    2019.7.5刷题统计
  • 原文地址:https://www.cnblogs.com/frx9527/p/django_base.html
Copyright © 2020-2023  润新知